import qualified Data.Set as S import Data.List import Data.Ord fork f g (x,y,z) = (f x, g y, z) snd' (_,y,_) = y main = do n <- readLn as <- map read . words <$> getLine bs <- map read . words <$> getLine let q = S.fromList (zip3 as (repeat 0) [0..]) print (levelup n q bs) levelup n q = minimum . take n . map (maximum . map snd' . S.elems . foldl hack q . take n) . tails . cycle hack q b = S.insert (fork (+ (div b 2)) (+1) m) q' where (m,q') = S.deleteFindMin q