一开始看到别人说用线段树做,看了题目,没一点想法,借鉴前人的思想,才想到用倒推来做,很基础的点更新,想清楚了就简单,不然还是蛮纠结的。
ACcode:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int size=200000;
int add[size+10][2];
int sum[size<<2],res[size+10];
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int rt,int l,int r)
{
if (l==r)
{
sum[rt]=1;
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int p,int v)
{
if (l==r)
{
sum[rt]=0;
res[l]=v;
return ;
}
int mid=(l+r)>>1;
if (p<sum[rt<<1]) update(rt<<1,l,mid,p,v);
else update(rt<<1|1,mid+1,r,p-sum[rt<<1],v);
pushup(rt);
}
int main()
{
int i,n;
while (~scanf("%d",&n))
{
build(1,1,n);
for (i=1;i<=n;i++) scanf("%d %d",&add[i][0],&add[i][1]);
for (i=n;i>0;i--) update(1,1,n,add[i][0],add[i][1]);
for (i=1;i<n;i++) printf("%d ",res[i]);
printf("%d\n",res[i]);
}
return 0;
}