WA #3 #5 #6 #7 #8 #9 #10
#include<bits/stdc++.h>
using namespace std;
const int M=5e4+10;
class TREAP{
private:
struct node{
int lc,rc,pri,val,size,cnt;
}tr[M];
int rdm(){
static unsigned long long zzx=2020150;
return (zzx*=23333)%2147483648;
}
int root,cntp;
int newnode(int val){
tr[++cntp].val=val;
tr[cntp].lc=tr[cntp].rc=0;
tr[cntp].size=tr[cntp].cnt=1;
tr[cntp].pri=rdm();
return cntp;
}
void update(int k){
tr[k].size=tr[tr[k].lc].size+tr[tr[k].rc].size+tr[k].cnt;
}
void zig(int &p){
int q=tr[p].lc;
tr[p].lc=tr[q].rc;
tr[q].rc=p;
tr[q].size=tr[p].size;
update(p);
p=q;
}
void zag(int &p){
int q=tr[p].rc;
tr[p].rc=tr[q].lc;
tr[q].lc=p;
tr[q].size=tr[p].size;
update(p);
p=q;
}
void ins(int &p,int val){
if(!p){
p=newnode(val);
return;
}
tr[p].size++;
if(tr[p].val==val){
tr[p].cnt++;
return;
}
if(val<tr[p].val){
ins(tr[p].lc,val);
if(tr[tr[p].lc].pri>tr[p].pri) zig(p);
}else{
ins(tr[p].rc,val);
if(tr[tr[p].rc].pri>tr[p].pri) zag(p);
}
}
void rem(int &p,int val){
if(!p) return;
tr[p].size--;
if(tr[p].val==val){
if(tr[p].cnt>1){
tr[p].cnt--;
return;
}
if(!tr[p].lc||!tr[p].rc) p=tr[p].lc+tr[p].rc;
else if(tr[tr[p].lc].pri>tr[tr[p].rc].pri){
zig(p);
rem(tr[p].rc,val);
}else{
zag(p);
rem(tr[p].rc,val);
}
return;
}
if(val<tr[p].val) rem(tr[p].lc,val);
else rem(tr[p].rc,val);
}
int rank(int p,int val){
if(!p) return 0;
if(val==tr[p].val) return tr[tr[p].lc].size+1;
else if(val<tr[p].val) return rank(tr[p].lc,val);
else return rank(tr[p].rc,val)+tr[tr[p].lc].size+tr[p].cnt;
}
int val(int p,int k){
if(!p) return 0;
if(tr[tr[p].lc].size>=k) return val(tr[p].lc,k);
else if(tr[tr[p].lc].size+tr[p].cnt>=k) return tr[p].val;
else return val(tr[p].rc,k-tr[tr[p].lc].size-tr[p].cnt);
}
int pre(int val){
int cur=root,res=2147483647;
while(cur)
if(tr[cur].val<val){
res=tr[cur].val;
cur=tr[cur].rc;
}else cur=tr[cur].lc;
return res;
}
int suf(int val){
int cur=root,res=-2147483647;
while(cur)
if(tr[cur].val>val){
res=tr[cur].val;
cur=tr[cur].lc;
}else cur=tr[cur].rc;
return res;
}
public:
void insert(int val){
ins(root,val);
}
void remove(int val){
rem(root,val);
}
int getrank(int val){
return rank(root,val);
}
int getval(int k){
return val(root,k);
}
int getpre(int val){
return pre(val);
}
int getsuf(int val){
return suf(val);
}
};
TREAP t;
int n;
int main(){
scanf("%d",&n);
for(int i=1,opt,x;i<=n;i++){
scanf("%d%d",&opt,&x);
switch(opt){
case 1:
t.insert(x);break;
case 2:
t.remove(x);break;
case 3:
printf("%d\n",t.getrank(x));break;
case 4:
printf("%d\n",t.getval(x));break;
case 5:
printf("%d\n",t.getpre(x));break;
case 6:
printf("%d\n",t.getsuf(x));break;
default:break;
}
}
return 0;
}