//#############################################################################
#include "bits/stdc++.h"
//#############################################################################
//Macros 
#define MOD 1000000007
#define INF 1000000000000009
#define eb emplace_back
#define mp make_pair
#define fr first
#define sc second
#define vec vector
#define len(x) x.size()
#define min3(a, b, c) min(a, min(b, c))
#define max3(a, b, c) max(a, max(b, c))
#define all(v) v.begin(), v.end()
#define alla(a, n) a, a + n
#define sum(v) accumulate(all(v),0LL)
//Type Defs
typedef long long ll;
typedef unsigned long long ull;
//#############################################################################
using namespace std;
//#############################################################################
//Globals
//#############################################################################
//Helpers
void io_handler()
{
#ifdef LOCAL_TESTING
    freopen("inputf.in", "r", stdin);
    freopen("outputf.in", "w", stdout);
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
template <typename T>
void print_matrix(vector<vec<T>> mat){
    for(auto row: mat){
        for(auto e : row){
            // auto fst = e[0]==INF?"INF":to_string(e[0]);
            // auto scd = e[1]==INF?"INF":to_string(e[1]);
            // cout <<"["<<fst<<","<<scd<< "]"<<" ";
            cout<<e<<" ";
        }
        cout << endl;
    }
}
template <typename T>
void print_vector(vector<T> v){
    for(auto e : v){cout<< e <<" ";}
    cout<<endl;
}
template <typename T>
map<T,T> get_count(vector<T> v){
    map<T,T> count;
    for(auto e: v){
        if(count.find(e)!=count.end()){count[e]++;}
        else{count[e] = 1;}}
    return count;
}
void add_self(ll &a, ll b){
    a = a+b; if (a>=MOD){a -= MOD;}
}
ll sub_mod(ll a, ll b){
    a = (a-b+MOD)%MOD;
    return a;
}
//#############################################################################
//Solution
const ll mxN = 2e5+100;
vec<ll> tree(4*mxN,0LL);
void update(int qidx, int idx, int ss, int se, ll delta){
    if(qidx<ss or qidx>se){return;}
    else if(ss==se){tree[idx]+=delta;}
    else{
        int mid = (ss+se)/2;
        if(qidx<=mid){
            update(qidx,2*idx+1,ss,mid,delta);
        } else{
            update(qidx,2*idx+2,mid+1,se,delta);
        }
        tree[idx] = max(tree[2*idx+1],tree[2*idx+2]);
    }
}
ll query(int idx, int ss, int se, int qs, int qe){
    if(qe<ss or qs>se){return -1;}
    else if(qs<=ss and se<=qe){
        return tree[idx];
    } else {
        int mid = (ss+se)/2;
        return max(query(2*idx+1,ss,mid,qs,qe),
                    query(2*idx+2,mid+1,se,qs,qe));
    }
}
void solve(){
    int n; cin>>n;
    vec<ll> h(n),v(n);
    for(int i = 0; i<n; i++){
        cin>>h[i];
    }
    for(int i = 0; i<n; i++){
        cin>>v[i];
    }
    for(int i =0; i<n; i++){
        ll add_up = query(0,0,mxN-1,0,h[i]-1)+v[i];
        update(h[i],0,0,mxN-1,add_up);
    }
    cout<<query(0,0,mxN-1,0,mxN-1)<<endl;
}
//#############################################################################
//Driver
int main()
{
    io_handler();
    int t = 1;
    //cin>>t;
    for (int i = 0; i < t; i++){
        solve();
    }
#ifdef LOCAL_TESTING
    cout << "⏰ Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}
//#############################################################################


Measured memory_bytes: 9600