//后面的点优先权高,思路详解http://www.cnblogs.com/CheeseZH/archive/2012/04/29/2476134.html
#include <iostream>
#include <cstring>
#include <cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N=200005;
int sum[N << 2];//存的是有多少个空位
int pos[N],val[N],ans[N];
int id;
void pushup(int rt){
sum[rt]=sum[rt << 1]+sum[rt << 1 | 1];
}
void build(int l,int r,int rt){
if(l==r){
sum[rt]=1;
return ;
}
int m= (l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int k,int l,int r,int rt){
sum[rt]--;
if(l == r){
id=l;
return ;
}
int m=(l+r)>>1;
if(k <= sum[rt<<1])update(k,lson);//k <= sum[rt<<1]
else {
k-=sum[rt<<1];
update(k,rson);
}
pushup(rt);
}
int main()
{
int n;
while(scanf("%d",&n)==1){
build(1,n,1);
for(int i=0;i<n;i++)scanf("%d%d",pos+i,val+i);
for(int i=n-1;i>=0;i--){
update(pos[i]+1,1,n,1);//pos[i]+1
ans[id]=val[i];
}
for(int i=1;i<n;i++)printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}