#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
const int MAXN = 1e6 + 5;
const int inf = (int)2e9 + 5;
const int infll = (int)4e18 + 5;
const int mod = (int)1e9 + 7;
int md;
struct SegmentTree {
int n;
vector<int> tree;
vector<int> lazy;
SegmentTree(int n) {
this->n = n;
tree.assign(4*n, 0);
lazy.assign(4*n, 0);
}
void relax(int v, int l, int r) {
if(lazy[v] == 0) return;
tree[v] += lazy[v];
if(l != r) {
lazy[v<<1] += lazy[v];
lazy[v<<1|1] += lazy[v];
}
lazy[v] = 0;
}
void update(int v, int l, int r, int a, int b, int val) {
relax(v, l, r);
if(r < a or l > b) return;
if(l >= a and r <= b) {
lazy[v] += val;
relax(v, l, r);
return;
}
int mid = (l + r) >> 1;
update(v<<1, l, mid, a, b, val);
update(v<<1|1, mid + 1, r, a, b, val);
tree[v] = max(tree[v<<1], tree[v<<1|1]);
}
int query(int v, int l, int r, int ql, int qr) {
relax(v, l, r);
if(r < ql or l > qr) return 0;
if(l >= ql and r <= qr) return tree[v];
int mid = (l + r) >> 1;
return max(query(v<<1, l, mid, ql, qr), query(v<<1|1, mid + 1, r, ql, qr));
}
};
void solve(){
int n;
cin >> n;
md = n;
vector<int> a(2*n + 1), b(2*n + 1);
SegmentTree st(2*n + 5);
for(int i = 1; i <= n; i++) {
cin >> a[i];
a[i + n] = a[i];
}
vector<int> pref(2*n + 1, 0);
for(int i = 1; i <= n; i++) {
cin >> b[i];
b[i+n] = b[i];
}
for(int i = 1; i <= 2*n; i++) {
pref[i] = pref[i-1] + b[i];
}
for(int i = 1; i <= 2*n; i++) {
st.update(1,1,2*n, i, i, a[i] - pref[i-1]);
st.update(1,1,2*n, i + n, i + n, a[i + n] - pref[i + n - 1]);
}
int mn = inf;
for(int i = 1; i <= n; i++) {
int x;
st.update(1,1,2*n, i, i + n - 1, pref[i-1]);
x = st.query(1,1,2*n, i, i+n-1);
st.update(1,1,2*n, i, i + n - 1, -pref[i-1]);
mn = min(x, mn);
}
cout << mn << endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
while(t--)
solve();
return 0;
}