#include <bits/stdc++.h>
#ifdef ONLINE_JUDGE
#define endl "\n"
#endif
using namespace std;
typedef unsigned long long int lu;
typedef long long int ll;
typedef long double ld;
typedef vector<ll> v;
typedef vector<lu> vu;
typedef vector<v> vv;
typedef vector<vu> vvu;
typedef vector<ld> vld;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef pair<ll, ll> pll;
typedef vector<set<ll>> vsll;
typedef set<pair<ll, ll>> spll;
typedef vector<spll> vspll;
typedef vector<pll> vpll;
typedef pair<lu, lu> puu;
typedef vector<puu> vpuu;
const ll MOD = 1000000007;
const ld PI = 2 * acos(0.0);
const v dx = {1, -1, 0, 0};
const v dy = {0, 0, 1, -1};
#define round(x, y) ((x + y - 1) / y)
#define ce(x, y) ((x + y - 1) / y)
#define amax(x, y) \
    if (y > x)     \
        x = y;
#define amin(x, y) \
    if (y < x)     \
        x = y;
#define lcm(x, y) ((x) * (y) / __gcd(x, y))
#define sz(x) (ll) x.size()
#define sq(x) ((x) * (x))
#define cb(x) ((x) * (x) * (x))
#define yes cout << "YES\n";
#define no cout << "NO\n";
#define yesno(f) \
    if (f)       \
        yes else no;
#define noo \
    { no return; }

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

template <typename T = ll>
vector<T> ga(ll n, bool oneIndexed = false) {
    vector<T> a = vector<T>(n + oneIndexed);

    for (ll i = 0; i < n; i++) {
        T p;
        cin >> p;
        a[i + oneIndexed] = p;
    }

    return move(a);
}

template <typename T, typename A>
void pa(vector<T, A> const &a, ll begin = 0, ll end = -1) {
    if (end == -1)
        end = sz(a) - 1;
    for (ll i = begin; i <= end; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

pll add(pll a, pll b) {
    return {max(a.first, b.first), a.second + b.second};
}

// handles both sum and count of elements present in that range
void build(vpll &tree, ll rL, ll rR, ll treeIdx, ll val) {
    if (rL == rR) {
        tree[treeIdx] = {val, 1};
    } else {
        ll mid = rL + rR;
        mid >>= 1;
        build(tree, rL, mid, treeIdx << 1, val);
        build(tree, mid + 1, rR, (treeIdx << 1) | 1, val);
        tree[treeIdx] = add(tree[treeIdx << 1], tree[(treeIdx << 1) | 1]);
    }
}

void update(vpll &tree, ll rL, ll rR, ll treeIdx, ll pos, ll val) {
    if (rL == rR) {
        if (pos == rL)
            tree[treeIdx] = {val, 1};
    } else {
        ll mid = rL + rR;
        mid >>= 1;
        if (pos <= mid)
            update(tree, rL, mid, treeIdx << 1, pos, val);
        else
            update(tree, mid + 1, rR, (treeIdx << 1) | 1, pos, val);
        tree[treeIdx] = add(tree[treeIdx << 1], tree[(treeIdx << 1) | 1]);
    }
}

pll query(vpll &tree, ll rL, ll rR, ll qL, ll qR, ll treeIdx) {
    if (rL >= qL && rR <= qR) {
        return tree[treeIdx];
    }
    if (qR < rL || qL > rR)
        return {0, 0};

    ll mid = (rL + rR) / 2;
    pll q1 = query(tree, rL, mid, qL, qR, treeIdx << 1);
    pll q2 = query(tree, mid + 1, rR, qL, qR, (treeIdx << 1) | 1);
    return add(q1, q2);
}

void solve() {
    ll n;
    cin >> n;
    v heights = ga(n);
    v beauties = ga(n);
    v dp(n, 0);
    vpll tree(4 * n);

    for (ll i = 0; i < n; i++) {
        dp[i] = beauties[i] + query(tree, 1, n, 1, heights[i], 1).first;
        update(tree, 1, n, 1, heights[i], dp[i]);
    }

    cout << *max_element(all(dp));
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    // freopen("file", "r", stdin);
    // freopen("file", "w", stdout);
    // ll t;cin >> t;while(t--)
    solve();
    return 0;
}

Measured memory_bytes: 17408