【POJ】2828 Buy Tickets

 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 }

你可能感兴趣的:(poj)