//#define LOCAL
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define sz(a) (int)a.size()
#define INF 0x3f3f3f3f
#define DNF 0x7f7f7f7f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define PiL pair <ll , ll>
#define PLL pair <ll , ll>
#define Pii pair <int , int>
#define mk(a, b) make_pair(a,b)
#define pb push_back
#define LF putchar('\n')
#define SP putchar(' ')
#define p_queue priority_queue
#define CLOSE ios::sync_with_stdio(0); cin.tie(0)
template<typename T>
void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f *= -1;ch = getchar();}while(isdigit(ch)){x = x * 10 + ch - 48; ch = getchar();}x *= f;}
template<typename T, typename... Args>
void read(T &first, Args& ... args) {read(first);read(args...);}
template<typename T>
void write(T arg) {T x = arg;if(x < 0) {putchar('-'); x =- x;}if(x > 9) {write(x / 10);}putchar(x % 10 + '0');}
template<typename T, typename ... Ts>
void write(T arg, Ts ... args) {write(arg);if(sizeof...(args) != 0) {putchar(' ');write(args ...);}}
using namespace std;
const int N = 100010;
struct node {
int lc , rc;
int v , rk , siz;
}tr[N];
int tot = 0 , root = 0;
//新加入点初始化
void update (int x) { tr[x].siz = tr[tr[x].lc].siz + tr[tr[x].rc].siz + 1;}
int Node(int v)
{
tot ++;
tr[tot].siz = 1 , tr[tot].v = v, tr[tot].rk = rand();
return tot;
}
//Teap合并
int merge(int x, int y)
{
if (!x || !y) return x + y;
if (tr[x].rk < tr[y].rk)
{
tr[x].rc = merge(tr[x].rc , y);
update(x);
return x;
}
else
{
tr[y].lc = merge(x, tr[y].lc);
update(y);
return y;
}
}
//Teap分裂
void split(int now , int& x , int& y , int k)
{
if(!now) x = y = 0;
else
{
if(tr[now].v <= k)
x = now, split(tr[now].rc, tr[now].rc, y , k);
else
y = now, split(tr[now].lc ,x, tr[now].lc , k);
update(now);
}
}
//找排名为k的数
int kth(int now , int k)
{
while (true)
{
if(k <= tr[tr[now].lc].siz)
now = tr[now].lc;
else
{
if(k == tr[tr[now].lc].siz + 1) return now;
else
{
k -= tr[tr[now].lc].siz + 1;
now = tr[now].rc;
}
}
}
}
//插入数
void Insert(int val)
{
int x, y;
split(root,x,y,val);
root = merge(merge(x,Node(val)),y);
}
//删除数
void Delet(int val)
{
int x , y, z;
split(root,x,z,val);
split(x , x , y ,val-1);
y = merge(tr[y].lc,tr[y].rc);
root = merge(merge(x,y),z);
}
//查询x数的排名(排名定义为比当前数小的数的个数 +1+1 )
void GetRank(int val)
{
int x, y;
split(root,x,y,val-1);
printf("%d\n",tr[x].siz+1);
root=merge(x,y);
}
//查询排名为x的数
void GetxRankNum(int val)
{
printf("%d\n",tr[kth(root,val)].v);
}
//求x的前驱(前驱定义为小于x,且最大的数)
void GetPre(int val)
{
int x, y;
split(root,x,y,val-1);
printf("%d\n",tr[kth(x,tr[x].siz)].v);
root=merge(x,y);
}
//求x的后继(后继定义为大于x,且最小的数)
void GetNxt(int val)
{
int x, y;
split(root,x,y,val);
printf("%d\n",tr[kth(y,1)].v);
root=merge(x,y);
}
int main()
{
srand((unsigned)time(NULL));
int n , x , y , z;
read (n);
for (int i = 1 ; i <= n ; i ++)
{
int op , val;
read (op , val);
if (op == 1)
Insert(val);
else if(op == 2)
Delet(val);
else if(op==3)
GetRank(val);
else if(op==4)
GetxRankNum(val);
else if(op==5)
GetPre(val);
else if(op==6)
GetNxt(val);
}
}
/*
5 6
2 3
1 2
1 3
3 4
4 5
4 2
1 1 5
0 4 2
1 5 1
-1
*/