/*Saurav Paul*/
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long int
#define loop(i,a,b)           for(ll i=a;i<=b;++i)
#define boost				  ios_base::sync_with_stdio(0);
#define eb                    emplace_back
#define mp                    make_pair
#define clr(x)                x.clear()
#define MOD                   1e9+7
#define itoc(c)               ((char)(((int)'0')+c))
#define ctoi(c)               ((int)(((int)c)-'0'))
#define all(p)                p.begin(),p.end()
#define iscn(num)             scanf("%d",&num);
#define scn(num)              scanf("%lld",&num);
#define scn2(num,num2)        scanf("%lld%lld",&num,&num2);
using namespace std;
///////////////////////

#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef PAUL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define dbg(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
////////////////////////

template<typename T>T set_bit(T N,T pos){return N=N | (1<<pos);}
template<typename T>T reset_bit(T N,T pos){return N= N & ~(1<<pos);}
template<typename T> bool check_bit(T N,T pos){return (bool)(N & (1<<pos));}
template<typename T>void bin_print(T N){bitset<25>bit(N);cerr<<bit.to_string()<<"\n";}
template<typename T> void max_self(T &a, T b){
	a=max(a,b);
}
template <typename T > void min_self(T &a, T b){
	a=min(a,b);
}
template <typename T > void add_self(T &a, T b){
	a+=b;
}
////////////////////////

const ll INF = 2e18 + 99;
typedef pair<ll,ll> Pair;
typedef vector<ll> vec;;

template<typename T> void ara_read(T &v,ll n){
	ll temp;
	for(ll i=0; i< n; i++){
		scanf("%lld",&temp);
		v.emplace_back(temp);
	}
}
template<typename T> void ara_print(T &v){
	for(ll x : v)
		printf("%lld ",x);
	puts("");
}
////////////////////////
ll query(int node,int a , int  b , int st , int sp ,vec &tree){
	
	assert(node);
	if(st > b || sp < a)
		return 0;
	if(st >=a && sp <=b)
		return tree[node];
		
	int lft = 2*node;
	int rght = 2*node + 1;
	int mid = (st+sp)/2;
	ll ans1 = query(lft,a,b,st,mid,tree);
	ll ans2 = query(rght,a,b,mid+1,sp,tree);
	
	return max(ans1,ans2);
}

void update_tree(int node ,int index ,int st , int sp ,ll newValue,vec &tree){
	if(sp < index || st > index)
		return ;
	if(st==sp){
		tree[node] = newValue;
		return ;
	}
	
	int lft = 2*node;
	int rght = 2*node +1 ;
	int mid= (st+sp)/2;
	update_tree(lft,index,st,mid,newValue,tree);
	update_tree(rght,index,mid+1,sp ,newValue,tree);
	
	tree[node] = max(tree[lft],tree[rght]);
	
}

int main()
{
	int n;
	scanf("%d",&n);
	vector <int > heights, beauties;
	ara_read(heights,n);
	ara_read(beauties,n);
	// segment tree.....
	
	vector <ll > tree(3*n);
	
	vector < ll > dp(n+1);
	for(int flower = 0 ; flower <n ; flower ++){
		
		int h = heights[flower];
		
		//Query on tree for getting max value from 1 to height[flower]...
		ll best = query(1,1,h,1,n,tree);
		
		dp[h] = best + beauties[flower] ;
		
		// updating the value....
		update_tree(1,h,1,n,dp[h],tree);
		
	}
	
	ll answer = 0;
	for(auto x : dp)
		max_self(answer,x);
		
	printf("%lld\n",answer);
    return 0;
}


Measured memory_bytes: 8180