#include<bits/stdc++.h>
using namespace std;
typedef int LL;
const LL MAXN=1e5+10;
LL len;
struct node{
LL data,size,num;
LL lch,rch,fa;
node(){
fa=data=size=lch=rch=num=0;
}
}tree[MAXN];
bool bl;
void init(LL l,LL dat,LL fa){
tree[l].num=1;
tree[l].data=dat;
if(l!=1) tree[l].fa=fa;
while(l>1){
if(tree[l].fa!=0) tree[tree[l].fa].size++;
l=tree[l].fa;
}
return;
}
LL search_num(LL id,LL x){
if(tree[id].data==x||id==0){
return 0;
}
if(tree[id].data>x){
return search_num(tree[id].lch,x);
}
else{
return search_num(tree[id].rch,x)+tree[tree[id].lch].size+tree[tree[id].lch].num+tree[id].num;
}
}
void search_rank(LL i ,LL x,LL minl){
LL rt=tree[tree[i].lch].num+tree[tree[i].lch].size+minl;
if(rt>x){
search_rank(tree[i].lch,x,0);
}
else{
if(rt==x-1) {
printf("%d\n",tree[i].data);
return;
}
search_rank(tree[i].rch,x,rt+tree[i].num);
}
}
void pre_search(LL id,LL x,LL maxl){
if(id==0){
printf("%d\n",maxl);
return;
}
if(tree[id].data>=x){
pre_search(tree[id].lch,x,maxl);
}
else{
maxl=max(tree[id].data,maxl);
pre_search(tree[id].rch,x,maxl);
}
}
void post_search(LL id,LL x,LL minl){
if(id==0){
printf("%d\n",minl);
return;
}
if(tree[id].data>x){
minl=min(tree[id].data,minl);
post_search(tree[id].lch,x,minl);
return;
}
else{
post_search(tree[id].rch,x,minl);
return;
}
}
void insert(LL id,LL x){
if(tree[id].data>x){
if(tree[id].lch==0){
tree[id].lch=++len;
init(len,x,id);
}
insert(tree[id].lch,x);
}
if(tree[id].data<x){
if(tree[id].rch==0){
tree[id].rch=++len;
init(len,x,id);
}
insert(tree[id].rch,x);
}
}
int main(){
LL q;
cin>>q;
for(LL i=1;i<=q;i++){
LL op,x;
cin>>op>>x;
switch(op){
case 1:
printf("%d\n",search_num(1,x)+1);
break;
case 2:
search_rank(1,x,0);
break;
case 3:
pre_search(1,x,-2147483647);
break;
case 4:
post_search(1,x,2147483647);
break;
case 5:
if(!bl) insert(0,x);
bl=true;
insert(1,x);
break;
}
}
return 0;
}