import qualified Data.Set as S import qualified Data.ByteString.Char8 as B import Data.List import Data.Ord import Data.Maybe fork f g (x,y,z) = (f x, g y, z) snd' (_,y,_) = y main = do n <- readLn as <- map (fst . fromJust . B.readInt) . B.words <$> B.getLine bs <- map (fst . fromJust . B.readInt) . B.words <$> B.getLine let q = S.fromList (zip3 as (repeat 0) [0..]) print (levelup n q (map (flip div 2) 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 (+b) (+1) m) q' where (m,q') = S.deleteFindMin q