从最后一个数开始考虑,比较空位
#include <iostream>
#include <stdio.h>#include <string.h>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 200200
int n[N];
struct tree
{
int l,r,sum;
}tr[4*N];
void build(int i,int l,int r)
{
tr[i].l=l;
tr[i].r=r;
tr[i].sum=r-l+1;
if(l==r)
return;
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}
int di;
void update(int i,int pos,int l,int r)
{
int mid=(l+r)/2;
tr[i].sum--;
if(l==r)
{
di=l;
return;
}
if(pos<=tr[i*2].sum)
update(i*2,pos,l,mid);
else
{
pos=pos-tr[i*2].sum;
update(i*2+1,pos,mid+1,r);
}
}
int main()
{
int t,i,a[N],p[N];
while(scanf("%d",&t)!=-1)
{for(i=1;i<=t;i++)
scanf("%d%d",&a[i],&n[i]);
build(1,1,t);
for(i=t;i>=1;i--)
{
update(1,a[i]+1,1,t);
p[di]=n[i];
}
printf("%d",p[1]);
for(i=2;i<=t;i++)
printf("% d",p[i]);
printf("\n");
}
return 0;
}