Source: https://www.cs.cmu.edu/~aldrich/courses/15-214-12fa/midterm-12sp-solutions.pdf