1 #include<cstdio> 2 #define MAXN 200010 3 int tree[MAXN<<2],pos[MAXN],val[MAXN],ans[MAXN]; 4 void Build(int L,int R,int rt) 5 { 6 tree[rt]=R-L+1; 7 if(L!=R) 8 { 9 int mid=(L+R)>>1; 10 Build(L,mid,rt<<1); 11 Build(mid+1,R,rt<<1|1); 12 } 13 } 14 int Update(int x,int L,int R,int rt) 15 { 16 tree[rt]--; 17 if(L==R) 18 return L; 19 int mid=(L+R)>>1; 20 if(tree[rt<<1]>=x) 21 return Update(x,L,mid,rt<<1); 22 else 23 { 24 x-=tree[rt<<1]; 25 return Update(x,mid+1,R,rt<<1|1); 26 } 27 } 28 int main() 29 { 30 int n,i,k; 31 while(~scanf("%d",&n)) 32 { 33 Build(1,n,1); 34 for(i=1;i<=n;i++) 35 scanf("%d%d",&pos[i],&val[i]); 36 for(i=n;i;i--) 37 { 38 k=Update(pos[i]+1,1,n,1); 39 ans[k]=val[i]; 40 } 41 for(i=1;i<n;i++) 42 printf("%d ",ans[i]); 43 printf("%d\n",ans[i]); 44 } 45 return 0; 46 }