对于前两个菜,直接枚举,以后的每一个菜的价格都是前一个菜的价格+当前没选的菜的 Bi 最小的价格
#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)std::cin>>a[i]
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
CI N=5e5+5;
struct node1 {
int a,b,id;
bool operator<(const node1& y)const {
if(a==y.a) {
if(b==y.b) {
return id<y.id;
}
return b>y.b;
}
return a<y.a;
}
}a[N];
struct node2 {
int a,b,id;
bool operator<(const node2& y)const {
if(b==y.b) {
if(a==y.a) {
return id<y.id;
}
return a>y.a;
}
return b<y.b;
}
}b[N];
int n,cnt=1,ans[N],vis[N];
signed main() {
std::cin>>n;
rep(i,1,n) {
std::cin>>a[i].a>>a[i].b;
b[i].a=a[i].a,b[i].b=a[i].b;
a[i].id=i,b[i].id=i;
}
std::sort(arrall(a,n));
std::sort(arrall(b,n));
rep(i,1,n) {
if(i==1) {
ans[i]=a[1].a;
} else if(i==2) {
if(a[1].id!=b[1].id) {
ans[i]=a[1].a+b[1].b;
vis[a[1].id]=vis[b[1].id]=1;
} else {
if(a[1].a+b[2].b<a[2].a+b[1].b) {
ans[i]=a[1].a+b[2].b;
vis[a[1].id]=vis[b[2].id]=1;
} else if(a[1].a+b[2].b>a[2].a+b[1].b) {
ans[i]=a[2].a+b[1].b;
vis[a[2].id]=vis[b[1].id]=1;
} else {
ans[i]=a[2].a+b[1].b;
vis[a[2].id]=vis[b[1].id]=1;
}
}
} else {
while(vis[b[cnt].id]) {
cnt++;
}
ans[i]=ans[i-1]+b[cnt++].b;
}
}
rep(i,1,n) {
std::cout<<ans[i]<<"\n";
}
return 0;
}