#include<bits/stdc++.h>
using namespace std;
const int N=1e4+7;
const int INF=2147483647;
int q;
struct node{
int left_son,right_son;
int val,cnt;
int size;
}t[N];
int tot;
inline int get_rank(int u,int x){
if(x==0) return 1;
if(t[u].val==x) return t[t[u].left_son].size+1;
if(t[u].val>x) return get_rank(t[u].left_son,x);
if(t[u].val<x) return get_rank(t[u].right_son,x)+t[t[u].left_son].size+t[u].cnt;
}
inline int get_num(int u,int x){
if(x==0) return INF;
if(t[t[u].left_son].size>=x) return get_num(t[u].left_son,x);
if(t[t[u].left_son].size+t[u].cnt>=x) return t[u].val;
if(t[t[u].left_son].size+t[u].cnt<x) return get_num(t[u].right_son,x-t[t[u].left_son].size-t[u].cnt);
}
inline int get_down(int u,int x,int ans){
if(t[u].val>=x){
if(t[u].left_son) return get_down(t[u].left_son,x,ans);
else return ans;
}
else{
if(t[u].right_son) return get_down(t[u].right_son,x,t[u].val);
else return t[u].val;
}
}
inline int get_up(int u,int x,int ans){
if(t[u].val<=x){
if(t[u].right_son) return get_up(t[u].right_son,x,ans);
else return ans;
}
else{
if(t[u].left_son) return get_up(t[u].left_son,x,t[u].val);
else return t[u].val;
}
}
inline void insert(int u,int x){
t[u].size++;
if(t[u].cnt==0) t[u].val=x;
if(t[u].val==x){
t[u].cnt++;
return;
}
if(t[u].val>x){
if(t[u].left_son) insert(t[u].left_son,x);
else insert(t[u].left_son=++tot,x);
}
if(t[u].val<x){
if(t[u].right_son) insert(t[u].right_son,x);
else insert(t[u].right_son=++tot,x);
}
}
int main(){
scanf("%d",&q);++tot;
while(q--){
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==1) printf("%d\n",get_rank(1,x));
if(opt==2) printf("%d\n",get_num(1,x));
if(opt==3) printf("%d\n",get_down(1,x,-INF));
if(opt==4) printf("%d\n",get_up(1,x,INF));
if(opt==5) insert(1,x);
}
return 0;
}