#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const double alpha=0.7;
struct node{
int l,r,val;
int size,fact;
bool vis;
}tzy[maxn];
int cnt,root;
vector<int>q;
void newnode(int &now,int val)
{
now=++cnt;
tzy[now].val=val;
tzy[now].fact=tzy[now].size=1;
tzy[now].vis=true;
}
bool imbalence(int now)
{
if(max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>tzy[now].size*alpha||tzy[now].size-tzy[now].fact>tzy[now].size*0.3) return false;
else return true;
}
void ldr(int now)
{
if(!now)return;
ldr(tzy[now].l);
if(tzy[now].vis)
q.push_back(now);
ldr(tzy[now].r);
}
void lift(int l,int r,int &now)
{
if(l==r)
{
now=q[l];
tzy[now].l=tzy[now].r=0;
tzy[now].size=tzy[now].fact=1;
return;
}
int mid=(l+r)>>1;
while(mid&&l<mid&&tzy[q[mid]].val==tzy[q[mid-1]].val)
mid--;
now=q[mid];
if(l<mid) lift(l,mid-1,tzy[now].l);
else tzy[now].l=0;
lift(mid+1,r,tzy[now].r);
tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
tzy[now].fact=tzy[tzy[now].l].fact+tzy[tzy[now].r].fact+1;
}
void update(int now,int end)
{
if(!now)return;
if(tzy[end].val<tzy[now].val) update(tzy[now].l,end);
else update(tzy[now].r,end);
tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
}
void rebuild(int &now)
{
q.clear();
ldr(now);
if(q.empty())
{
now=0;
return;
}
lift(0,q.size()-1,now);
}
void check(int &now,int end)
{
if(now==end)return;
if(imbalence(now))
{
rebuild(now);
update(root,now);
return ;
}
if(tzy[end].val<tzy[now].val) check(tzy[now].l,end);
else check(tzy[now].r,end);
}
void ins(int &now,int val)
{
if(!now)
{
newnode(now,val);
check(root,now);
return;
}
tzy[now].size++;
tzy[now].fact++;
if(val<tzy[now].val)
ins(tzy[now].l,val);
else
ins(tzy[now].r,val);
return;
}
void del(int now,int val)
{
if(tzy[now].vis&&tzy[now].val==val)
{
tzy[now].fact--;
tzy[now].vis=false;
check(root,now);
return;
}
tzy[now].fact--;
if(tzy[now].val>val) del(tzy[now].l,val);
else del(tzy[now].r,val);
return ;
}
int getrank(int val)
{
int now=root,rank=1;
while(now)
{
if(val<=tzy[now].val)
now=tzy[now].l;
else
{
rank+=tzy[now].vis+tzy[tzy[now].l].fact;
now=tzy[now].r;
}
}
return rank;
}
int gettnum(int rank)
{
int now=root;
while(now)
{
if(tzy[now].vis&&tzy[tzy[now].l].fact+tzy[now].vis==rank) break;
else if(tzy[tzy[now].l].fact>=rank) now=tzy[now].l;
else {
rank-=tzy[tzy[now].l].fact+tzy[now].vis;
now=tzy[now].r;
}
}
return tzy[now].val;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int opt,val;
scanf("%d%d",&opt,&val);
switch(opt){
case 1:{
ins(root,val);
break;
}
case 2:{
del(root,val);
break;
}
case 3:{
printf("%d\n",getrank(val));
break;
}
case 4:{
printf("%d\n",gettnum(val));
break;
}
case 5:{
printf("%d\n",gettnum(getrank(val)-1));
break;
}
case 6:{
printf("%d\n",gettnum(getrank(val)+1));
break;
}
}
}
}