#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using vl = vector<ll>;
template<class T> using vc = vector<T>;
template<class T> using vvc = vector<vector<T>>;

#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define repr(i, n) for (ll i = (n)-1; i >= 0; i--)
#define repe(i, l, r) for (ll i = (l); i < (r); i++)
#define reper(i, l, r) for (ll i = (r)-1; i >= (l); i--)
#define repa(i,n) for (auto& i: n)

template<class T> inline bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> inline bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
void init() {cin.tie(0);ios::sync_with_stdio(false);cout << fixed << setprecision(15);}

#ifdef DEBUG
template <class T, class N> void verr(const T& a, const N& n) { rep(i, n) cerr << a[i] << " "; cerr << "\n" << flush; }
ll dbgt = 1; void err() { cerr << "passed " << dbgt++ << "\n" << flush; }
template<class H, class... T> void err(H&& h,T&&... t){ cerr<< h << (sizeof...(t)?" ":"\n") << flush; if(sizeof...(t)>0) err(forward<T>(t)...); }
#endif

const ll INF = 5e18;
const ld EPS = 1e-11;
const ld PI = acos(-1.0L);
const ll MOD = 1e9 + 7;
// const ll MOD = 998244353;
//--------------------------------------------------------------------------------//
ll H[200000], A[200000];
template <class T>
struct SegTree {
    // 葉の数
    int n;
    // データを格納するvector
    vector<T> data;
    // 初期値かつ単位元
    T def;
    // 区間クエリで使う処理
    function<T(T, T)> operation;
    // 点更新で使う処理
    function<T(T, T)> update;

    // 区間[a,b)の総和。ノードk=[l,r)に着目している。
    T _query(int a, int b, int k, int l, int r) {
        if (r <= a || b <= l) return def;  // 交差しない
        if (a <= l && r <= b)
            return data[k];  // a,l,r,bの順で完全に含まれる
        else {
            T c1 = _query(a, b, 2 * k + 1, l, (l + r) / 2);  // 左の子
            T c2 = _query(a, b, 2 * k + 2, (l + r) / 2, r);  // 右の子
            return operation(c1, c2);
        }
    }

   public:
    // _n:必要サイズ, _def:初期値かつ単位元, _operation:クエリ関数,
    // _update:更新関数
    SegTree(size_t _n, T _def, function<T(T, T)> _operation,
            function<T(T, T)> _update)
        : def(_def), operation(_operation), update(_update) {
        n = 1;
        while (n < _n) {
            n *= 2;
        }
        data = vector<T>(2 * n - 1, def);
    }

    // 場所i(0-indexed)の値をxで更新
    void change(int i, T x) {
        i += n - 1;
        data[i] = update(data[i], x);
        while (i > 0) {
            i = (i - 1) / 2;
            data[i] = operation(data[i * 2 + 1], data[i * 2 + 2]);
        }
    }

    // [a, b)の区間クエリを実行
    T query(int a, int b) {
        return _query(a, b, 0, 0, n);
    }

    // 添字でアクセス
    T operator[](int i) {
        return data[i + n - 1];
    }
};
//operation 区間取得クエリ
//auto f=[](ll a, ll b){ return a + b; } 加算なら左の二項演算
//update 一点更新クエリ
//auto g=[](ll now, ll x){ return now + x; } 一点にxを足すならこれ
//auto g=[](ll now, ll x){ return x; } now→xに更新するならこれ
// Segree<T> seg(N, unit, f, g) 要素数, 単位元, 取得関数, 更新関数
ll dp[200005];
int main() {
    init();
    ll N;
    cin >> N;
    rep(i, N) cin >> H[i];
    rep(i, N) cin >> A[i];

    auto f = [](ll a, ll b) { return max(a, b); };
    SegTree<ll> seg(N + 1, 0, f, f);

    rep(i,N){
        seg.change(H[i], seg.query(0, H[i])+A[i]);
    }
    cout << seg.query(0, N + 1) << endl;
}

Measured memory_bytes: 7552