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 }
posted on 2012-05-21 13:41  DrunBee  阅读(262)  评论(0编辑  收藏  举报