#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<utility>
#include<algorithm>
#define maxn 200100
using namespace std;
int pos[maxn],val[maxn],size[maxn<<2],ans[maxn],point[maxn];
int n;
void build_tree(int l,int r,int i)
{
size[i]=r-l+1;
if(l==r)
{
point[l]=i;
return;
}
int mid=(l+r)/2;
build_tree(l,mid,i+i);
build_tree(mid+1,r,i+i+1);
}
int require(int sum,int l,int r,int i)
{
if(l==r)
return l;
int mid=(l+r)/2;
if(size[i+i]>=sum)
return require(sum,l,mid,i+i);
return require(sum-size[i+i],mid+1,r,i+i+1);
}
void change(int i)
{
while(i>0)
{
size[i]--;
i/=2;
}
}
void init()
{
for(int i=1;i<=n;i++)
scanf("%d%d\n",&pos[i],&val[i]);
}
void solve()
{
memset(size,0,sizeof(size));
build_tree(1,n,1);
for(int i=n;i>=1;i--)
{
int t=require(pos[i]+1,1,n,1);
ans[t]=i;
change(point[t]);
}
for(int i=1;i<=n-1;i++)
cout<<val[ans[i]]<<' ';
cout<<val[ans[n]]<<endl;
}
int main()
{
while(scanf("%d\n",&n)==1)
{
init();
solve();
}
return 0;
}
POJ 2828
最新推荐文章于 2020-05-13 21:54:43 发布