import Data.List
import Data.Bits ((.&.))
import Data.Array.Unboxed
import Data.Array.MArray
import Data.Array.ST
import Control.Monad
import Control.Monad.ST

type Elem = Int
type BIT s = STUArray s Int Elem

{-
BITについて
sup2によりnを２の冪にする
配列をdp[1]~[n] 変数はi'
添え字iに対して、親ノードはi`div`2、子ノードは2*i,2*i+1
それぞれPは一点、Rは範囲の操作
fが群の演算ならば（逆元が存在すれば）、任意の範囲を取り出すことが可能
モノイドならば(1,n)のような範囲を取り出し可能
-}

--nを超える最小の２の冪
sup2 :: Int -> Int
sup2 n = 2^(ceiling $ logBase 2 (fromIntegral n :: Double) :: Int)

newBIT :: MArray a e m => Int -> e -> m (a Int e)
newBIT n e = newArray (1,n) e

--logN
readRBIT' :: BIT s -> (Elem -> Elem -> Elem) -> Int -> Int -> ST s Elem
readRBIT' bit f i partial
  | 1 > i = return partial
  | otherwise = do
    a <- readArray bit i
    readRBIT' bit f (i-(i .&. (-i))) (f a partial)

readPBIT :: BIT s -> (Elem -> Elem -> Elem) -> Int -> Int -> ST s Elem
readPBIT bit f i partial
  = do
    (_,a) <- getBounds bit
    if a < i then return partial
      else do
        a <- readArray bit i
        readPBIT bit f (i+(i .&. (-i))) (f a partial)

--(1,i)の範囲で更新
modifyRBIT' :: BIT s -> (Elem -> Elem) -> Int -> ST s ()
modifyRBIT' bit f i
  | i < 1 = return ()
  | otherwise  = do
   readArray bit i >>= writeArray bit i .f
   modifyRBIT' bit f (i-(i .&. (-i)))

modifyPBIT :: BIT s -> (Elem -> Elem) -> Int -> ST s ()
modifyPBIT bit f i
   = do
   (_,a) <- getBounds bit
   if a < i then return ()
     else do
        now <- readArray bit i
        writeArray bit i $ f now
        --traceShowM (i,now,f now)
        modifyPBIT bit f (i+(i .&. (-i)))

solve :: Int -> [Int] -> [Int] -> ST s Elem
solve n hs as = do
  bit' <- newBIT n 0
  solve' bit' n hs as
  where
    solve' bit n [] _ = readPBIT bit max n 0
    solve' bit n (h:hs) (a:as) = do
      a' <- readRBIT' bit max h 0
      modifyPBIT bit (max $ a+a') h
      solve' bit n hs as

main :: IO ()
main = do
  n <- readLn
  hs <- map read.words <$> getLine
  as <- map read.words <$> getLine
  print $ runST $ solve n hs as
