#include<bits/stdc++.h>
#define longint long long
using namespace std;
inline longint read(){
char ch=getchar();longint x=0;bool flag=0;
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') flag=1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(flag) return -x;return x;
}
longint n,maxn=-2e18,wei,de;
priority_queue<int> qian;
bool b[100001];
struct asd{
longint distance,tired,t,wei,ch;
}a[100001];
bool operator<(const asd &a,const asd &b){
return a.t>b.t;
}
priority_queue<asd> q;
int main(){
n=read();longint u=1;
for(int i=1;i<=n;i++) a[i].distance=read();
for(int i=1;i<=n;i++) a[i].tired=read();
for(int i=1;i<=n;i++) a[i].t=2*a[i].distance+a[i].tired,a[i].wei=i;
for(int i=1;i<=n;i++) if(2*a[i].distance+a[i].tired>maxn) maxn=2*a[i].distance+a[i].tired,wei=a[i].distance,de=i;
printf("%lld\n",maxn);b[de]=1;
for(int i=1;i<de;i++) qian.push(a[i].tired);
for(int i=de+1;i<=n;i++) q.push(a[i]);
while(u<n){
u++;
longint ls=0;
if(!q.empty()){
ls=q.top().t;
while(b[q.top().wei]){
q.pop();
ls=q.top().t;
}
}
longint qjj=0;
if(!qian.empty()) qjj=qian.top();
if(ls<qjj){
qian.pop();
maxn+=qjj;
}else{
maxn+=ls-2*wei;
for(int i=de+1;i<q.top().wei;i++){
b[i]=1;
qian.push(q.top().tired);
q.pop();
}
de=q.top().wei;
wei=q.top().distance;
q.pop();
}
printf("%lld\n",maxn);
}
}