POJ2828-Buy Tickets
http://poj.org/problem?id=2828
#include<stdio.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=200001; int pos[maxn],val[maxn],ans[maxn],em[maxn<<2],index; void build(int l,int r,int rt) { if(l==r) { em[rt]=1; return; } int m=l+r>>1; build(lson); build(rson); em[rt]=r-l+1; } void update(int a,int l,int r,int rt) { em[rt]--; if(l==r) { index=l; return; } int m=l+r>>1; if(em[rt<<1]>=a) update(a,lson); else { a-=em[rt<<1]; update(a,rson); } return; } int main(void) { int i,j,n; while (scanf("%d",&n)!=EOF) { build(1,n,1); for(i=1;i<=n;i++) scanf("%d%d",&pos[i],&val[i]); for(i=n,j=1;i>=1;i--,j++) { update(pos[i]+1,1,n,1); ans[index]=val[i]; } for(i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",ans[i]); } return 0; }