#include
<
iostream
>
using
namespace
std;
#define
MAXN 200001
struct
Node{
int
l,r,c;
}nod[
3
*
MAXN];
int
ans[MAXN],a[MAXN],b[MAXN],n;
void
buildtree(
int
u,
int
l,
int
r){
nod[u].c
=
r
-
l
+
1
;
//
需要在此区间插入的人数
nod[u].l
=
l;
nod[u].r
=
r;
if
(l
==
r)
return
;
buildtree(
2
*
u,l,(l
+
r)
/
2
);
buildtree(
2
*
u
+
1
,(l
+
r)
/
2
+
1
,r);
}
void
insert(
int
u,
int
pos,
int
val){
nod[u].c
--
;
if
(nod[u].l
==
nod[u].r){
ans[nod[u].l]
=
val;
//
在最终插入位置前需预留pos个空位,注意到第n个人的插入位置就是pos
return
;
}
if
(nod[
2
*
u].c
>=
pos)
insert(
2
*
u,pos,val);
else
insert(
2
*
u
+
1
,pos
-
nod[u
*
2
].c,val);
}
int
main(){
int
i;
while
(scanf(
"
%d
"
,
&
n)
!=
EOF){
buildtree(
1
,
1
,n);
for
(i
=
0
;i
<
n;i
++
){
scanf(
"
%d%d
"
,a
+
i,b
+
i);
a[i]
++
;
}
for
(i
=
n
-
1
;i
>=
0
;i
--
)
insert(
1
,a[i],b[i]);
for
(i
=
1
;i
<
n;i
++
)
printf(
"
%d
"
,ans[i]);
printf(
"
%d\n
"
,ans[i]);
}
return
0
;
}