#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, std::less<T>, rb_tree_tag, tree_order_statistics_node_update>;
using ll = long long;
using vi = vector<long long>;
using pr = pair<ll, ll>;
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
#define endl "\n"
const int mod = 1000000007;
const int emod = 998244353;
int msb(ll x){if(x==0)return -1;return 63-__builtin_clzll(x);}
ll exp(ll x, ll y){ll ans=1;while(y>0){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans;}
ll madd(ll x, ll y) {return (x%mod + y%mod)%mod;}
ll msub(ll x, ll y) {return (x%mod - y%mod + mod)%mod;}
ll mmul(ll x, ll y) {return ((x%mod)*(y%mod))%mod;}
ll mdiv(ll x, ll y) {return (x%mod)*exp(y, mod-2)%mod;}
void solution();
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
solution();
return 0;
}
struct Node {
ll mx, val;
Node() {mx = -1e18, val = 0;}
};
Node _merge(Node a1, Node a2) {
a2.val += a1.val;
a2.mx = max(a1.mx, a2.mx-a1.val);
return a2;
}
struct SegTree {
vector<Node> tree;
vi a, b;
ll n;
SegTree(const vi &_a, const vi &_b) {
a = _a;
b = _b;
n = a.size();
tree.resize(n<<1);
for (int i = 0; i < n; i++) {
tree[i+n].mx = a[i];
tree[i+n].val = b[i];
}
for (int i = n-1; i > 0; i--) {
tree[i] = _merge(tree[i<<1], tree[i<<1|1]);
}
}
void update(int i, ll val, ll mx) {
i+=n;
tree[i].mx = mx;
tree[i].val = val;
for (i>>=1; i > 0; i>>=1) {
tree[i] = _merge(tree[i<<1], tree[i<<1|1]);
}
}
Node query(int l, int r) {
if (l>r) return Node();
Node L, R;
for (l+=n, r+=n; l<=r; l >>=1, r >>=1) {
if (l&1) L = _merge(L, tree[l++]);
if (r&1^1) R = _merge(tree[r--], R);
}
return _merge(L, R);
}
};
void solution() {
ll n; cin >> n;
vi a(n), b(n);
for (ll &z : a) cin >> z;
for (ll &z : b) cin >> z;
SegTree m(a, b);
ll ans = 1e18;
for (int i = 0; i < n; i++) {
ll k = b[0];
ll p = a[0];
Node t = m.query(i, n-1);
m.update(0, t.val+k, p-(t.val));
ans = min(ans, max(t.mx, m.query(0, i-1).mx));
m.update(0, k, p);
}
cout << ans << endl;
}