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;
}
posted @ 2012-08-31 10:58  Yogurt Shen  阅读(176)  评论(0编辑  收藏  举报