RT
#include<bits/stdc++.h>
#define N 10004
using namespace std;
int q,root,len;
struct node{
int val,ch[2],cnt,siz;
}tree[N];
inline int ls(int id){return tree[id].ch[0];}
inline int rs(int id){return tree[id].ch[1];}
inline int new_node(int val){
tree[++len]={val,{0,0},1,1};
return len;
}
inline void push_up(int id){
tree[id].siz=tree[ls(id)].siz+tree[rs(id)].siz+tree[id].cnt;
}
void insert(int &id,int val){
if(!id){
id=new_node(val);
return;
}
//tree[id].siz++;
if(val<tree[id].val)
insert(tree[id].ch[0],val);
else if(val>tree[id].val)
insert(tree[id].ch[1],val);
else
tree[id].cnt++;
push_up(id);
}
int rnk(int id,int val){
if(val<tree[id].val)
return rnk(ls(id),val);
if(val>tree[id].val)
return rnk(rs(id),val)+tree[ls(id)].siz+tree[id].cnt;
return tree[ls(id)].siz;
}
int kth(int id,int k){
if(k<=tree[ls(id)].siz)
return kth(ls(id),k);
if(k>tree[id].cnt+tree[ls(id)].siz)
return kth(rs(id),k-tree[id].cnt-tree[ls(id)].siz);
return tree[id].val;
}
int forward(int id,int val){
if(!id)return -2147483647;
if(val<=tree[id].val)
return forward(ls(id),val);
return max(tree[id].val,forward(rs(id),val));
}
int backward(int id,int val){
if(!id)return 2147483647;
if(val>=tree[id].val)
return backward(rs(id),val);
return min(tree[id].val,backward(ls(id),val));
}
int main(){
int op,x;
scanf("%d",&q);
while(q--){
scanf("%d%d",&op,&x);
switch(op){
case 1:
printf("%d\n",rnk(root,x)+1);
break;
case 2:
printf("%d\n",kth(root,x));
break;
case 3:
printf("%d\n",forward(root,x));
break;
case 4:
printf("%d\n",backward(root,x));
break;
case 5:insert(root,x);break;
}
}
}