{-# LANGUAGE BangPatterns #-} import Control.Monad.State (State, get, put, runState, state) import Data.Array (Array) data Tree = Root Int Int | Node Int Tree data Forest = Array Int Tree findRoot :: Tree -> (Int, [(Int, Tree)]) findRoot (Root i n) = (i, []) findRoot (Node i t) = (r, [(i, Node i ] ++ []) squareLatticeEdges :: Int -> Int -> [(Int, Int)] squareLatticeEdges d l = [ (i, (l ^ j) * quot i (l ^ j) + mod (l ^ j + i + l ^ (j - 1)) (l ^ j)) | j <- [1 .. d] , i <- [0 .. (l ^ d) - 1] ]