You can do it in the end, and it will be overwritten later.
#include <cstdio>#include <cstring>#include <algorithm>#include <climits>#include <string>#include <iostream>#include <map>#include <cstdlib>#include <list>#include <set>#include <queue>#include <stack>#include<math.h>using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int maxn=222222;int sum[maxn<<2];int color[maxn<<2];int a[maxn];int b[maxn];void up(int rt){ sum[rt]= sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){ color[rt]=0; if(l==r){ sum[rt]=1; return ; } int mid=(l+r)>>1; build(lson); build(rson); up(rt);}void update(int ans,int add,int l,int r,int rt){ if(l==r){ sum[rt]-=1; color[rt]= add; return ; } int mid=(l+r)>>1; if(ans<=sum[rt<<1]) update(ans,add,lson); else update(ans-sum[rt<<1],add,rson); up(rt);}void ask(int key,int l,int r,int rt){ if(l==r){ printf("%d ",color[rt]) ;return ; } int mid=(l+r)>>1; if(key<=mid) ask(key,lson); else ask(key,rson);}int main(){ int n; while(scanf("%d",&n)!=EOF){ build(1,n,1); for(int i=0;i<n;i++){ scanf("%d%d",&a[i],&b[i]); } for(int i=n-1;i>=0;i--){ update(a[i]+1,b[i],1,n,1); } for(int i=1;i<=n;i++) ask(i,1,n,1); cout<<endl; } return 0;}