http://poj.org/problem?id=2828
可以从后往前看,那么pos就变成了前面有几个空位,线段树每个区间表示该区间空位有多少。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a>b?b:a;}
#define LL long long
#define pi acos(-1)
#define N 200010
#define INF INT_MAX
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
struct node
{
int l,r;
int kong;
};
struct gao
{
int pos;
int val;
}a[N];
int ans[N];
node c[N*3];
int n;
void Build(int i,int s,int t)
{
c[i].l=s;
c[i].r=t;
c[i].kong=t-s+1;
if(s==t)return ;
int mid=(s+t)>>1;
Build(2*i,s,mid);
Build(2*i+1,mid+1,t);
}
void update(int i,int pos,int val)
{
c[i].kong--;
if(c[i].l==c[i].r)
{
ans[c[i].l]=val;
return ;
}
if(c[i<<1].kong>=pos)update(i<<1,pos,val);
else
{
pos-=c[i<<1].kong;
update((i<<1)+1,pos,val);
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
Build(1,1,n);
for(i=0;i<n;i++)
scanf("%d%d",&a[i].pos,&a[i].val);
for(i=n-1;i>=0;--i)
{
update(1,a[i].pos+1,a[i].val);
}
for(i=1;i<=n;i++)
printf(i!=n ?"%d ":"%d\n",ans[i]);
}
return 0;
}