pku2828 Buy Tickets

 

 

#include  < iostream >
using   namespace  std;

#define  MAXN 200001

struct  Node{
    
int  l,r,c;
}nod[
3 * MAXN];

int  ans[MAXN],a[MAXN],b[MAXN],n;

void  buildtree( int  u, int  l, int  r){
    nod[u].c
= r - l + 1 ; // 需要在此区间插入的人数
    nod[u].l = l;
    nod[u].r
= r;
    
if (l == r)
        
return ;
    buildtree(
2 * u,l,(l + r) / 2 );
    buildtree(
2 * u + 1 ,(l + r) / 2 + 1 ,r);
}

void  insert( int  u, int  pos, int  val){
    nod[u].c
-- ;
    
if (nod[u].l == nod[u].r){
        ans[nod[u].l]
= val; // 在最终插入位置前需预留pos个空位,注意到第n个人的插入位置就是pos
         return ;
    }
    
if (nod[ 2 * u].c >= pos)
        insert(
2 * u,pos,val);
    
else
        insert(
2 * u + 1 ,pos - nod[u * 2 ].c,val);
}


int  main(){
    
int  i;
    
while (scanf( " %d " , & n) != EOF){
        buildtree(
1 , 1 ,n);
        
for (i = 0 ;i < n;i ++ ){
            scanf(
" %d%d " ,a + i,b + i);
            a[i]
++ ;
        }
        
for (i = n - 1 ;i >= 0 ;i -- )
            insert(
1 ,a[i],b[i]);
        
for (i = 1 ;i < n;i ++ )
            printf(
" %d  " ,ans[i]);
        printf(
" %d\n " ,ans[i]);
    }
    
return   0 ;
}

 

你可能感兴趣的:(pku)