做完这道题才意识到什么是线段树的巧妙运用。
yy才是王道啊!
关键词:倒叙插入。
#include <stdio.h>
#define maxn 200050
#define lson l , m , rt * 2
#define rson m+1 , r , rt * 2 + 1
int n;
int rest[maxn*4],ans[maxn];
int id[maxn],value[maxn];
void PushUp(int rt)
{
rest[rt] = rest[rt*2] + rest[rt*2+1];
}
void build(int l,int r,int rt)
{
if(l == r){
rest[rt] = 1;
return ;
}
int m = (l + r) / 2;
build(lson);
build(rson);
PushUp(rt);
}
void update(int index,int cur,int l,int r,int rt)
{
if(l == r)
{
rest[rt] = 0;
ans[l] = cur;
return ;
}
int m = (l + r) / 2;
if(index <= rest[rt*2])
update(index,cur,lson);
else
update(index-rest[rt*2],cur,rson);
PushUp(rt);
}
int main()
{
int i;
while(scanf("%d",&n)==1)
{
build(1,n,1);
for(i=1;i<=n;i++)
scanf("%d%d",&id[i],&value[i]);
for(i=n;i>=1;i--)
{
update(id[i]+1,value[i],1,n,1);
}
printf("%d",ans[1]);
for(i=2;i<=n;i++)
printf(" %d",ans[i]);
printf("\n");
}
}