#include <bits/stdc++.h>
#define l(x) d[x].lson
#define r(x) d[x].rson
using namespace std;
struct st{
int siz,lson,rson,v,cnt,rnd;
};
st d[100005];
uniform_int_distribution<int> u;
mt19937 mt(chrono::system_clock().now().time_since_epoch().count());
namespace treap{
int cnt;
inline void zag(int &a){
int t=r(a);
r(a)=l(t),l(t)=a,d[t].siz=d[a].siz,d[a].siz=d[l(a)].siz+d[r(a)].siz+1,a=t;
}
inline void zig(int &a){
int t=l(a);
l(a)=r(t),r(t)=a,d[t].siz=d[a].siz,d[a].siz=d[l(a)].siz+d[r(a)].siz+1,a=t;
}
inline void insert(int &a,int v){
if(a==0){
a=++cnt,d[a].siz=d[a].cnt=1,d[a].v=v,d[a].rnd=u(mt);
return ;
}
d[a].siz++;
if(v==d[a].v){
d[a].cnt++;
return ;
}
if(v<d[a].v){
insert(l(a),v);
if(d[l(a)].rnd<d[a].rnd) zig(a);
}
else{
insert(r(a),v);
if(d[r(a)].rnd<d[a].rnd) zag(a);
}
}
inline void remove(int &a,int v){
if(v==d[a].v){
if(d[a].cnt>1) d[a].cnt--,d[a].siz--;
else if(l(a)==0||r(a)==0) a=l(a)+r(a);
else if(d[l(a)].rnd<d[r(a)].rnd){
zig(a);
remove(a,v);
}
else{
zag(a);
remove(a,v);
}
return ;
}
d[a].siz--;
if(v<d[a].v) remove(l(a),v);
if(v>d[a].v) remove(r(a),v);
}
inline int rank(int a,int v){
if(a==0) return 0;
if(v<=d[a].v) return rank(l(a),v);
return d[l(a)].siz+d[a].cnt+rank(r(a),v);
}
inline int query(int a,int b){
if(b<=d[l(a)].siz) return query(l(a),b);
if(b<=d[l(a)].siz+d[a].cnt) return d[a].v;
return query(r(a),b-d[l(a)].siz-d[a].cnt);
}
inline int pre(int a,int v){
int ans=-0x7fffffff;
while(a){
if(v>d[a].v) ans=d[a].v,a=r(a);
else a=l(a);
}
return ans;
}
inline int nxt(int a,int v){
int ans=0x7fffffff;
while(a){
if(v<d[a].v) ans=d[a].v,a=l(a);
else a=r(a);
}
return ans;
}
}
int main(){
int n,opt,x,rt=0;
int t;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&opt,&x);
if(opt==1) treap::insert(rt,x);
if(opt==2) treap::remove(rt,x);
if(opt==3) printf("%d\n",treap::rank(rt,x)+1);
if(opt==4) printf("%d\n",treap::query(rt,x));
if(opt==5) printf("%d\n",treap::pre(rt,x));
if(opt==6) printf("%d\n",treap::nxt(rt,x));
}
return 0;
}