http://www.cs.helsinki.fi/courses/582351/2013/s/k/1