逆序插入,这样就能把第i个位置上的人确定下来了。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 210000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int n,id;
int pos[maxn],num[maxn],sq[maxn];
int tree[maxn<<2];
void build(int l,int r,int rt)
{
int m=(l+r)>>1;
tree[rt]=r-l+1;
if(l==r)
{
return;
}
build(lson);
build(rson);
}
void update(int l,int r,int rt,int p)
{
int m=(l+r)>>1;
tree[rt]--;
if(l==r)
{
id=l;
return;
}
if(tree[rt<<1]>=p)
{
update(lson,p);
}
else
{
p-=tree[rt<<1];
update(rson,p);
}
}
int main()
{
while(~scanf("%d",&n))
{
build(1,n,1);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&pos[i],&num[i]);
}
for(int i=n;i>=1;i--)
{
update(1,n,1,pos[i]+1);
sq[id]=num[i];
}
printf("%d",sq[1]);
for (int i=2;i<=n;i++)
printf(" %d",sq[i]);
printf("\n");
}
return 0;
}