in partial fulfillment of course work for MTAT.03.238 Advanced Algorithms course (https://courses.cs.ut.ee/2013/algorithmics/spring/Main/HomePage)