<pre name="code" class="cpp">#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<stdio.h>
#include<math.h>
#include<queue>
using namespace std;
int n, m, sum, count, flag;
struct node
{
int l, r, sum, v;
} s[600001];
struct Node
{
int pos, v;
} num[200001];
void build( int l, int r, int k )
{
s[k].l=l;
s[k].r=r;
s[k].sum=0;
if( l==r )
return ;
build( l,( l+r )/2,k*2 );
build( ( l+r )/2+1, r, k*2 +1 );
}
void update( int i, int k )
{
if( s[k].l==s[k].r )
{
s[k].sum=1;
s[k].v=num[i].v;
return ;
}
int len=( s[k*2].r-s[k*2].l )+1;
if( len>num[i].pos+s[k*2].sum )
update( i,k*2 );
else
{
num[i].pos-=len-s[k*2].sum;
update( i,k*2+1 );
}
s[k].sum=s[k*2].sum+s[k*2+1].sum;
}
void search( int k )
{
if( s[k].l==s[k].r )
{
if( flag==0 )
{
printf( "%d",s[k].v );
flag=1;
}
else
printf( " %d",s[k].v );
return ;
}
search( k*2 );
search( k*2+1 );
}
int main()
{
int i, j, k, t, cas=0;
while( scanf( "%d",&n )!=-1 )
{
for( i=1; i<=n; i++ )
scanf( "%d%d",&num[i].pos,&num[i].v );
build( 1,n ,1 );
for( i=n; i>0; i-- )
update( i, 1 );
flag=0;
search( 1 );
printf( "\n" );
}
return 0;
}
poj 2828 Buy Tickets 线段树
最新推荐文章于 2019-08-29 20:18:30 发布