TM
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,s[N],p[N],x[N],t;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&s[i]);
for(int i=1;i<=n;i++)scanf("%d",&p[i]),p[i]+=2*s[i];
for(int k=0;k<n;){
int j=k;
k=max_element(p+k+1,p+n+1)-p;
x[++t]=p[k]-2*s[j];
for(int i=j+1;i<k;i++)x[++t]=p[i]-2*s[i];
}
sort(x+1,x+n+1,greater<int>());
t=0;
for(int i=1;i<=n;i++){t+=x[i];cout<<t<<endl;}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,s[N],p[N],x;
priority_queue<int> q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&s[i]);
for(int i=1;i<=n;i++)scanf("%d",&p[i]),p[i]+=2*s[i];
for(int k=0;k<n;){
int j=k;
k=max_element(p+k+1,p+n+1)-p;
q.push(p[k]-2*s[j]);
for(int i=j+1;i<k;i++)q.push(p[i]-2*s[i]);
}
while(!q.empty()){int t=q.top();x+=t;printf("%d\n",x);q.pop();}
return 0;
}
#include<cstdio>
#include<queue>
using namespace std;
const int N=100010;
struct node{ int s,v;}h[N];
priority_queue<int> q;
int n,x;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&h[i].s);
for(int i=1;i<=n;i++)scanf("%d",&h[i].v);
int k=0;
h[0].s=h[0].v=0;
for(;;){
int mx=-1,j=k;
for(int i=k+1;i<=n;i++)
if(2*(h[i].s-h[j].s)+h[i].v>mx)mx=2*(h[i].s-h[j].s)+h[i].v,k=i;
q.push(mx);
for(int i=j+1;i<k;i++)q.push(h[i].v);
if(k==n)break;
}
x=0;
while(!q.empty()){int t=q.top();x+=t;printf("%d\n",x);q.pop();}
return 0;
}
#include<cstdio>
#include<queue>
using namespace std;
const int N=100010;
struct node{
int s,v;
bool operator < (node a)const{ return v<a.v;}
}h[N],s;
priority_queue<node> q;
int n,x;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&h[i].s);
for(int i=1;i<=n;i++)scanf("%d",&h[i].v);
s.s=s.v=0;
q.push(s);
int now=0,mx=0;
for(int i=1;i<=n;i++){
int next=now;
s=q.top();
mx=s.v;
for(int j=now+1;j<=n;j++)//寻找now以后的最优房屋
if(h[j].v+(h[j].s-h[now].s)*2>mx){
mx=h[j].v+(h[j].s-h[now].s)*2;
next=j;
}
h[next].v+=(h[next].s-h[now].s)*2;//更新
if(now!=next)q.push(h[next]);//入队
for(int j=now+1;j<next;j++)//now到next之间的房屋入队
q.push(h[j]);
s=q.top();//弹出堆顶
x+=s.v;//加入答案
q.pop();
printf("%d\n",x);//输出
now=next;//now=next继续寻找最优值
}
return 0;
}