#include<iostream>
using namespace std;
struct Tree{
int lchild=0,rchild=0;
int data,num=0,father=0;
int pm=1;
}tree[10001];
int top=0;
void insert(int x){
tree[++top].data=x;
int k=1;
if(top>1){
while(k<=top-1){
int tdata=tree[k].data;
if(x<tdata){
if(tree[k].lchild==0){
tree[k].lchild=top;
tree[top].father=k;
tree[k].num++;
break;
}
k=tree[k].lchild;
}else{
tree[k].pm++;
if(tree[k].rchild==0){
tree[k].rchild=top;
tree[top].father=k;
break;
}
k=tree[k].rchild;
}
}
}
return;
}
int cpm(int x){
int sear=1;
while(1){
if(tree[sear].data==x) break;
else if(x<tree[sear].data) sear=tree[sear].lchild;
else sear=tree[sear].rchild;
}
if(!sear) return 0;
return tree[sear].pm;
}
int pmc(int x){
int sear=1;
while(1){
int k;
k=tree[sear].pm;
if(x==k) break;
else if(x<k) sear=tree[sear].rchild;
else sear=tree[sear].lchild;
}
return tree[sear].data;
}
int pre(int x){
int sear=1;
while(1){
if(tree[sear].data==x) break;
else if(x<tree[sear].data) sear=tree[sear].lchild;
else sear=tree[sear].rchild;
}
int t=tree[sear].lchild;
if(t==0){
if(tree[tree[tree[sear].father].rchild].data==tree[sear].data) return tree[tree[sear].father].data;
else return -2147483647;
}
while(1){
if(tree[t].rchild==0) break;
t=tree[t].rchild;
}
return max(tree[tree[sear].father].data,tree[t].data);
}
int nxt(int x){
int sear=1;
while(1){
if(tree[sear].data==x)
break;
else if(x<tree[sear].data) sear=tree[sear].lchild;
else sear=tree[sear].rchild;
}
int t=tree[sear].rchild;
if(t==0){
if(tree[tree[tree[sear].father].lchild].data==tree[sear].data) return tree[tree[sear].father].data;
else return 2147483647;
}
while(1){
if(tree[t].lchild==0) break;
t=tree[t].lchild;
}
if(tree[tree[tree[sear].father].lchild].data==tree[sear].data)
return min(tree[tree[sear].father].data,tree[t].data);
else
return tree[t].data;
}
int main(){
int q;
cin >> q;
while(q--){
int opt,x;
cin >> opt >> x;
if(opt==5) insert(x);
else if(opt==1) cout << cpm(x) << endl;
else if(opt==2) cout << pmc(x) << endl;
else if(opt==3) cout << pre(x) << endl;
else cout << nxt(x) << endl;
}
return 0;
}