import Control.Parallel.Strategies

main = print $ run 
       
run = runEval $ do
       r1 <- rpar (maxC lo (m - 1)) 
       r2 <- rpar (maxC m hi)       
       return (max r1 r2)
  where
         m = (lo + hi) `div` 2
         lo = 1
         hi = 100000
         
collatz :: Integer -> Int
collatz 0      =  0
collatz 1      =  0
collatz n
  | even n     =  1 + collatz (n `div` 2)
  | otherwise  =  1 + collatz (3 * n + 1)

maxC :: Int -> Int -> Int
maxC lo hi = maximum (map (collatz . fromIntegral) [lo..hi])
