#include<iostream>
using namespace std;
const int MAXN=10001;
int Size[MAXN],Num[MAXN],L[MAXN],R[MAXN],Val[MAXN],index=1;
void insert(int V,int Pos=1){
Size[Pos]++;
if(Num[Pos]==0&&!L[Pos]==0&&!R[Pos]==0){
Val[Pos]=V;
Num[Pos]++;
}
else if(V==Val[Pos]){
Num[Pos]++;
}
else if(V>Val[Pos]){
if(!R[Pos])R[Pos]=++index;
insert(V,R[Pos]);
}
else{
if(!L[Pos])L[Pos]=++index;
insert(V,L[Pos]);
}
return;
}
int CountLess(int V,int Pos=1){
if(V<Val[Pos]){
return L[Pos]?CountLess(V,L[Pos]):0;
}
else if(V>Val[Pos]){
return Size[L[Pos]]+Num[Pos]+(R[Pos]?CountLess(V,R[Pos]):0);
}
else return Size[L[Pos]];
}
int CountGreater(int V,int Pos=1){
if(V<Val[Pos]){
return Size[R[Pos]]+Num[Pos]+(L[Pos]?CountGreater(V,L[Pos]):0);
}
else if(V>Val[Pos]){
return R[Pos]?CountGreater(V,R[Pos]):0;
}
else return Size[R[Pos]];
}
int Find(int k,int Pos=1){
if(Size[L[Pos]]>k-1){
Find(k,L[Pos]);
}
else if(Size[L[Pos]]+Num[Pos]>k){
Find(k-Size[L[Pos]]-Num[Pos],R[Pos]);
}
else return Val[Pos];
}
int Pre(int V){
int Temp=CountLess(V);
return Temp?Find(Temp):-2147483647;
}
int Next(int V){
int Temp=CountGreater(V);
return Temp?Find(Size[1]-Temp+1):2147483647;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int F,V;
scanf("%d%d",&F,&V);
switch(F){
case 1:{
printf("%d\n",CountLess(V)+1);
break;
}
case 2:{
printf("%d\n",Find(V));
break;
}
case 3:{
printf("%d\n",Pre(V));
break;
}
case 4:{
printf("%d\n",Next(V));
break;
}
case 5:{
insert(V);
break;
}
default:{
printf("Input Error\n");
return -1;
}
}
}
return 0;
}