#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
struct node{
int l,r;
int key,value;
int cnt,size;
}tr[100010];
int n,root,idx;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f*x;
}
inline void write(int x) {
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
void pushup(int p){
tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+tr[p].cnt;
}
int add(int key){
tr[++idx].key=key;
tr[idx].value=rand();
tr[idx].cnt=tr[idx].size=1;
return idx;
}
void start(){
add(-1e9),add(1e9);
root=1,tr[1].r=2;
pushup(root);
}
void zig(int &p){
int q=tr[p].l;
tr[p].l=tr[q].r;
tr[q].r=p;
p=q;
pushup(tr[p].r);
pushup(p);
}
void zag(int &p){
int q=tr[p].r;;
tr[p].r=tr[q].l;
tr[q].l=p;
p=q;
pushup(tr[p].l);
pushup(p);
}
void insert(int &p,int key){
if(!p)p=add(key);
else if(tr[p].key==key)tr[p].cnt++;
else if(tr[p].key>key){
insert(tr[p].l,key);
if(tr[tr[p].l].value>tr[p].value) {
zig(p);
}
}
else{
insert(tr[p].r,key);
if(tr[tr[p].r].value>tr[p].value){
zag(p);
}
}
pushup(p);
}
void del(int &p,int key){
if(!p)return ;
if(tr[p].key==key){
if(tr[p].cnt>1)tr[p].cnt--;
else if(tr[p].l || tr[p].r){
if(!tr[p].r || tr[tr[p].l].value>tr[tr[p].r].value){
zig(p);
del(tr[p].r,key);
}
else{
zag(p);
del(tr[p].l,key);
}
}
else p=0;
}
else if(tr[p].key>key)del(tr[p].l,key);
else del(tr[p].r,key);
pushup(p);
}
int getr(int p,int key){
if(!p)return -1e9;
if(tr[p].key==key) return tr[tr[p].l].size+1;
if(tr[p].key>key)return getr(tr[p].l,key);
return tr[tr[p].l].size+tr[p].cnt+getr(tr[p].r,key);
}
int getk(int p,int rank){
if(!p)return 1e9;
if(tr[tr[p].l].size>=rank)return getk(tr[p].l,rank);
if(tr[tr[p].l].size+tr[p].cnt>=rank)return tr[p].key;
return getk(tr[p].r,rank-tr[tr[p].l].size-tr[p].cnt);
}
int getp(int p,int key){
if(!p)return -1e9;
if(tr[p].key>=key)return getp(tr[p].l,key);
return max(tr[p].key,getp(tr[p].r,key));
}
int getn(int p,int key){
if(!p)return 1e9;
if(tr[p].key<=key)return getn(tr[p].r,key);
return min(tr[p].key,getn(tr[p].l,key));
}
int main(){
start();
scanf("%d",&n);
while(n--){
int op,x;
scanf("%d%d",&op,&x);
if(op==1)insert(root,x);
else if(op==2)del(root,x);
else if(op==3)printf("%d\n",getr(root,x)-1);
else if(op==4)printf("%d\n",getk(root,x+1));
else if(op==5)printf("%d\n",getp(root,x));
else printf("%d\n",getn(root,x));
}
return 0;
}