从平衡树模板copy来的,寻思也没问题啊
// Problem: P3369 【模板】普通平衡树
// LuoguUID: 514700
// LuoguUserName: MicroSun
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
int read(){
int a=1,x=0;char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') a=-1,ch=getchar();
while(isdigit(ch)) x=x*10+ch-48,ch=getchar();
return a*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+48);
}
const int N=1e5+10;
struct node{int ls,rs,key,pri,size;}t[N];
int cnt;
void newn(int x){t[++cnt]={0,0,x,rand(),1};}
void upd(int u){t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;}
void zag(int &u){//left rotate
int k=t[u].rs;
t[u].rs=t[k].ls;t[k].ls=u;
t[k].size=t[u].size;
upd(u);
u=k;
}
void zig(int &u){//right rotate
int k=t[u].ls;
t[u].ls=t[k].rs;t[k].rs=u;
t[k].size=t[u].size;
upd(u);
u=k;
}
void insert(int &u,int x){
if(u==0) {newn(x);u=cnt;return;}
t[u].size++;
if(x>=t[u].key) insert(t[u].rs,x);
else insert(t[u].ls,x);
if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) zig(u);
if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) zag(u);
upd(u);
}
int rank(int u,int x){
if(u==0) return 0;
if(x>t[u].key) return t[t[u].ls].size+1+rank(t[u].rs,x);
return rank(t[u].ls,x);
}
int trank(int u,int k){
if(k==t[t[u].ls].size+1) return t[u].key;
if(k>t[t[u].ls].size+1) return trank(t[u].rs,k-t[t[u].ls].size-1);
return trank(t[u].ls,k);
}
int qq(int u,int x){// qq is qian_qv
if(u==0) return 0;
if(t[u].key>=x) return qq(t[u].ls,x);
int tmp=qq(t[u].rs,x);
if(tmp==0) return t[u].key;
return tmp;
}
int hq(int u,int x){// hq is hou_qv
if(u==0) return 0;
if(t[u].key<=x) return hq(t[u].rs,x);
int tmp=hq(t[u].ls,x);
if(tmp==0) return t[u].key;
return tmp;
}
int main(){
srand(1);
int s=0,n=read();
insert(s,2147483647);
insert(s,-2147483647);
while(n--){
int opt=read(),x=read();
switch(opt){
case 5: insert(s,x);break;
case 1: write(rank(s,x));putchar('\n');break;
case 2: write(trank(s,x+1));putchar('\n');break;
case 3: write(qq(s,x));putchar('\n');break;
case 4: write(hq(s,x));putchar('\n');break;
}
}
return 0;
}