#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstdlib>
using namespace std;
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f
int read()
{
int now=0,nev=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-')
nev=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
now=(now<<1)+(now<<3)+(c&15);
c=getchar();
}
return now*nev;
}
const int MAXN=1e5+10;
int n;
int root,tt;
struct node
{
int l,r;
int p;
int w;
int size;
int c;
}tr[MAXN];
void rotate_left(int &k)
{
tr[k].r=tr[tr[k].r].l;
tr[tr[k].r].l=k;
tr[tr[k].r].size=tr[k].size;
tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].c;
k=tr[k].r;
}
void rotate_right(int &k)
{
tr[k].l=tr[tr[k].l].r;
tr[tr[k].l].r=k;
tr[tr[k].l].size=tr[k].size;
tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].c;
k=tr[k].l;
}
void insert_x(int &k,int x)
{
if(!k)
{
k=++tt;
tr[k].w=x;
tr[k].p=rand();
tr[k].c=1;
tr[k].size=1;
tr[k].l=0;
tr[k].r=0;
return ;
}
tr[k].size++;
if(tr[k].w==x)
tr[k].c++;
if(x<tr[k].w)
{
insert_x(tr[k].l,x);
if(tr[tr[k].l].p<tr[k].p)
rotate_right(k);
}
else
{
insert_x(tr[k].r,x);
if(tr[tr[k].r].p<tr[k].p)
rotate_left(k);
}
}
void delete_x(int &k,int x)
{
if(tr[k].size==x)
{
if(tr[k].size>1)
{
tr[k].size--;
tr[k].c--;
}
else if(!tr[k].l || !tr[k].r)
k=tr[k].l+tr[k].r;
else if(tr[tr[k].l].p<tr[tr[k].r].p)
{
rotate_right(k);
delete_x(k,x);
}
else
{
rotate_left(k);
delete_x(k,x);
}
return ;
}
tr[k].size--;
if(tr[k].w<x)
delete_x(tr[k].r,x);
else
delete_x(tr[k].l,x);
}
int get_rank(int x)
{
int k=root;
int rank=0;
while(k)
{
if(x==tr[k].w)
return rank+tr[tr[k].l].size+1;
if(x<tr[k].w)
k=tr[k].l;
if(x>tr[k].w)
{
rank+=tr[tr[k].l].size+tr[k].c;
k=tr[k].r;
}
}
return rank;
}
int get_kthmath(int x)
{
int k=root;
while(k)
{
if(x>tr[k].l && x<=tr[tr[k].l].size+tr[k].c)
return tr[k].w;
if(x<=tr[tr[k].l].size)
k=tr[k].l;
else
{
x-=tr[tr[k].l].size+tr[k].c;
k=tr[k].r;
}
}
}
int get_pre(int x)
{
int k=root;
int pre=-INF;
while(k)
{
if(x>tr[k].w)
{
pre=tr[k].w;
k=tr[k].r;
}
else
k=tr[k].l;
}
return pre;
}
int get_nxt(int x)
{
int k=root;
int nxt=INF;
while(k)
{
if(x<tr[k].w)
{
nxt=tr[k].w;
k=tr[k].l;
}
else
k=tr[k].r;
}
return nxt;
}
int main()
{
memset(tr,0,sizeof(tr));
n=read();
root=tt=0;
while(n--)
{
int op,x;
op=read(),x=read();
if(op==1)
insert_x(root,x);
else if(op==2)
delete_x(root,x);
else if(op==3)
printf("%d\n",get_rank(x));
else if(op==4)
printf("%d\n",get_kthmath(x));
else if(op==5)
printf("%d\n",get_pre(x));
else if(op==6)
printf("%d\n",get_nxt(x));
}
return 0;
}