题目链接:https://www.luogu.org/problemnew/show/P3369
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=1e5+100;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){
if(y==0) return x;
return gcd(y,x%y);
}
int n,rt,tot=0;
struct Treap{
int son[2],val,cnt,sz,data;
}node[maxn];
inline int Rand(){
static ll r=2333;
return (r*=233333LL)%=2147483647;
}
inline void pushup(int x){
node[x].sz=node[node[x].son[0]].sz+node[node[x].son[1]].sz+node[x].cnt;
}
inline int build(int val){
node[++tot].val=val;
node[tot].cnt=node[tot].sz=1;
node[tot].son[0]=node[tot].son[1]=0;
node[tot].data=Rand();
return tot;
}
inline void init(){
rt=build(-2e9),node[rt].son[1]=build(2e9),pushup(rt);
}
inline void Rotate(int &x,int d){
int k=node[x].son[d^1];
node[x].son[d^1]=node[k].son[d];
node[k].son[d]=x,x=k;
pushup(node[x].son[d]),pushup(x);
}
inline void insert(int &x,int val){
if(!x) {x=build(val);return;}
++node[x].sz;
if(node[x].val==val) ++node[x].cnt;
else if(node[x].val>val){
insert(node[x].son[0],val);
if(node[x].data<node[node[x].son[0]].data)
Rotate(x,1);
}else{
insert(node[x].son[1],val);
if(node[x].data<node[node[x].son[1]].data)
Rotate(x,0);
}
pushup(x);
}
inline void Delete(int &x,int val){
if(!x) return ;
if(node[x].val==val){
if(node[x].cnt>1){
--node[x].cnt;
pushup(x);
return ;
}
if(node[x].son[0]||node[x].son[1]){
if(!node[x].son[1]||node[node[x].son[0]].data>node[node[x].son[1]].data)
Rotate(x,1),Delete(node[x].son[1],val);
else Rotate(x,0),Delete(node[x].son[0],val);
}else x=0;
}
else if(node[x].val>val) Delete(node[x].son[0],val);
else Delete(node[x].son[1],val);
pushup(x);
}
inline int get_rank(int val){
int x=rt,rk=0;
while(x){
if(node[x].val==val) return node[node[x].son[0]].sz+rk+1;
else if(node[x].val>val) x=node[x].son[0];
else{
rk+=node[node[x].son[0]].sz+node[x].cnt,
x=node[x].son[1];
}
}
return 0;
}
inline int get_val(int rk){
int x=rt;
while(x){
if(node[node[x].son[0]].sz>=rk) x=node[x].son[0];
else if(node[node[x].son[0]].sz+node[x].cnt>=rk)
return node[x].val;
else{
rk-=node[node[x].son[0]].sz+node[x].cnt;
x=node[x].son[1];
}
}
return 0;
}
inline int get_pre(int val){
int x=rt,pre=0;
while(x){
if(node[x].val<val) pre=node[x].val,x=node[x].son[1];
else x=node[x].son[0];
}
return pre;
}
inline int get_nxt(int val){
int x=rt,nxt=0;
while(x){
if(node[x].val>val){
nxt=node[x].val;
x=node[x].son[0];
}
else x=node[x].son[1];
}
return nxt;
}
int main(){
scanf("%d",&n);
init();///
for(int i=1;i<=n;i++){
int op,x;
scanf("%d%d",&op,&x);
switch(op){
case 1:insert(rt,x);break;
case 2:Delete(rt,x);break;
case 3:printf("%d\n",get_rank(x)-1);break;
case 4:printf("%d\n",get_val(x+1));break;
case 5:printf("%d\n",get_pre(x));break;
case 6:printf("%d\n",get_nxt(x));break;
}
}
return 0;
}