#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<ctime>
usingnamespacestd;structnode{intv,fix,l,r,weight,size;node(){v=fix=l=r=weight=size=0;}inlineintlsize();inlineintrsize();}tree[100005];int&start=tree[0].r;//存放树的虚拟根
#define now tree[k]//在各种操作中简化代码
#define son tree[y]
intamount=0;inlineintnode::lsize(){if(l==0)return0;elsereturntree[l].size;}inlineintnode::rsize(){if(r==0)return0;elsereturntree[r].size;}inlinenode&left(nodek){returntree[k.l];}inlinenode&right(nodek){returntree[k.r];}inlineboolisLeave(nodek)//判断叶子节点
{return(bool)k.l==0&&k.r==0;}inlinevoidrt(int&k){inty=now.l;now.l=son.r;//swap the subtree
son.r=k;k=y;y=now.r;//needless if not use size but important
son.size=son.lsize()+son.rsize()+son.weight;now.size=now.lsize()+now.rsize()+now.weight;}inlinevoidlt(int&k){inty=now.r;now.r=son.l;//swap the subtree
son.l=k;k=y;y=now.l;son.size=son.lsize()+son.rsize()+son.weight;now.size=now.lsize()+now.rsize()+now.weight;}inlinevoidinsert(int&k,intkey){if(k==0)//新建
{k=++amount;now.v=key;now.fix=rand();now.l=now.r=0;now.weight=1;now.size=1;}else{if(key<now.v){++now.size;//先加后递归
insert(now.l,key);if(now.fix<left(now).fix){rt(k);}}elseif(key>now.v){++now.size;insert(now.r,key);if(now.fix<right(now).fix){lt(k);}}else//key==now.v
{++now.size;//勿忘
++now.weight;}}}inlinevoidremove(int&k,intkey){if(k==0)return;if(now.v!=key){if(now.l!=0&&key<now.v){remove(now.l,key);--now.size;//先递归再减
}elseif(now.r!=0&&key>now.v){remove(now.r,key);--now.size;}return;}if(now.weight>1){--now.weight;--now.size;// don't forget this one
return;}if(isLeave(now)){k=0;return;}elseif(now.l==0){k=now.r;return;}elseif(now.r==0){k=now.l;return;}else{if(left(now).fix<right(now).fix){lt(k);remove(now.l,key);--now.size;}else{rt(k);remove(now.r,key);--now.size;}}}intMAX,MIN;//供pre()&suc()使用
inlineintpre(intk,intkey){if(k==0)returnMAX;if(now.v<key){MAX=now.v;pre(now.r,key);}else{pre(now.l,key);}returnMAX;}inlineintsuc(intk,intkey){if(k==0)returnMIN;if(now.v>key){MIN=now.v;suc(now.l,key);}else{suc(now.r,key);}returnMIN;}inlineintfindkth(intk,intkey){if(key<now.lsize()+1){returnfindkth(now.l,key);}elseif(key>now.lsize()+now.weight){returnfindkth(now.r,key-now.lsize()-now.weight);}elsereturnnow.v;}inlineintfindrank(intk,intkey,intcur=0){if(now.v==key){returnnow.lsize()+cur+1;}elseif(key<now.v){returnfindrank(now.l,key,cur);}elseif(key>now.v){returnfindrank(now.r,key,cur+now.lsize()+now.weight);}}voidmidq(int&k)//中序遍历输出
{if(k==-1)return;if(now.l!=0){midq(now.l);}for(inti=1;i<=now.weight;++i)printf("%d ",now.v);if(now.r!=0){midq(now.r);}}inlinevoidinit(){srand(time(NULL));}intmain(){intn,opt,x;init();scanf("%d",&n);for(inti=1;i<=n;i++){scanf("%d%d",&opt,&x);switch(opt){case1:insert(start,x);break;case2:remove(start,x);break;case3:printf("%d\n",findrank(start,x));break;case4:printf("%d\n",findkth(start,x));break;case5:printf("%d\n",pre(start,x));break;case6:printf("%d\n",suc(start,x));break;}//printf("\t");midq(start);printf("\n");
}return0;}