#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,val;
int cnt;
int siz;
}tree[10010];
int cnt;
void insert(int rt,int val)
{
tree[rt].siz ++;
if(tree[rt].val == val)
{
tree[rt].cnt++;
return;
}
else if(tree[rt].val > val)
{
if(tree[rt].l == 0)
{
cnt++;
tree[cnt].val = val;
tree[cnt].siz = tree[cnt].cnt = 1;
tree[rt].l = cnt;
}
else
{
insert(tree[rt].l,val);
}
}
else
{
if(tree[rt].r == 0)
{
cnt++;
tree[cnt].val = val;
tree[cnt].siz = tree[cnt].cnt = 1;
tree[rt].r = cnt;
}
else
{
insert(tree[rt].r,val);
}
}
return;
}
int get_rank(int rt,int val)
{
if(rt==0)
{
return 1;
}
if(tree[rt].val == val)
{
int lchild = tree[rt].l;
return tree[lchild].siz + 1;
}
else if(tree[rt].val > val)
{
return get_rank(tree[rt].l,val);
}
else
{
return tree[tree[rt].l].siz + tree[rt].cnt + get_rank(tree[rt].r,val);
}
}
int get_val(int rt,int rk)
{
if(tree[tree[rt].l].siz >= rk)
{
return get_val(tree[rt].l,rk);
}
else if(tree[tree[rt].l].siz + tree[rt].cnt >= rk)
{
return tree[rt].val;
}
else
{
return get_val(tree[rt].r,rk-tree[tree[rt].l].siz-tree[rt].cnt);
}
}
int get_pre(int rt,int val)
{
int rk = get_rank(rt,val);
if(rk == 1)
{
return -2148483647;
}
return get_val(1,rk-1);
}
int get_next(int rt,int val)
{
int rk = get_rank(rt,val + 1);
if(rk == cnt+1)
{
return 2148483647;
}
return get_val(rt,rk);
}
int main()
{
int q;
cin >> q;
while(q--)
{
int opt, x;
cin >> opt >> x;
if(opt==1)
{
cout << get_rank(1,x) << endl;
}
else if(opt==2)
{
cout << get_val(1,x) << endl;
}
else if(opt==3)
{
cout << get_pre(1,x) << endl;
}
else if(opt==4)
{
cout << get_next(1,x) << endl;
}
else
{
if(cnt==0)
{
cnt++;
tree[cnt].val = x;
tree[cnt].cnt = tree[cnt].siz = 1;
}
else
{
insert(1,x);
}
}
}
return 0;
}