样例#1的输出与我的程序的输出一样,也同样没有超时
#include<bits/stdc++.h>
using namespace std;
const int INF=1e9+1000;
const int N=1e7+1000;
struct TreeNode {
int left;
int right;
int mix;
int val;
int weight;
int size;
}a[N];
int n,tot=0,rt;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
while('0'<=c&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
int pushup(int root)
{
a[root].size=a[a[root].left].size+a[a[root].right].size+a[root].weight;
}
void Left_Rotate(int &root) { //左旋
int temp=a[root].right;
a[root].right=a[temp].left;
a[temp].left=root;
pushup(root);
pushup(temp);
root=temp;
}
void Right_Rotate(int &root) { //右旋
int temp=a[root].left;
a[root].left=a[temp].right;
a[temp].right=root;
pushup(root);
pushup(temp);
root=temp;
}
void insert(int &root,int val) { //插入
// cout<<a[root].val<<" "<<a[root].left<<" "<<a[root].right<<" "<<a[root].mix<<" "<<'\n';
if(root==0) {
tot++;
root=tot;
a[tot].left=0;
a[tot].right=0;
a[tot].val=val;
a[tot].mix=rand();
a[tot].size=1;
a[tot].weight=1;
return;
}
else if(val==a[root].val) {
a[root].weight++;
}
else if(val<a[root].val) {
insert(a[root].left,val);
if(a[root].mix>a[a[root].left].mix) {
Right_Rotate(root);
}
}
else if(val>a[root].val) {
insert(a[root].right,val);
if(a[root].mix>a[a[root].right].mix) {
Left_Rotate(root);
}
}
pushup(root);
}
void T_delete(int &root,int val) { //删除
if(!root) return ;
if(val<a[root].val) {
T_delete(a[root].left,val);
} else if(val>a[root].val) {
T_delete(a[root].right,val);
} else {
if(a[root].weight>1)
{
a[root].weight--;
pushup(root);
return;
}
if(a[root].left==0&&a[root].right==0) {
root=0;
return;
} else {
if(a[a[root].left].mix>a[a[root].right].mix) {
Right_Rotate(root);
T_delete(a[root].right,val);
}
else {
Left_Rotate(root);
T_delete(a[root].left,val);
}
}
}
pushup(root);
}
int get_rank(int root,int num) { //求当前数的排名
if(!root) return 1;
if(num==a[root].val) return a[a[root].left].size+1;
else if(num<a[root].val) return get_rank(a[root].left,num);
else return a[a[root].left].size+a[root].weight+get_rank(a[root].right,num);
}
int get_num(int root,int rank) { //求当前排名的数
if(!root) return INF;
if(rank<=a[a[root].left].size) return get_num(a[root].left,rank);
else if(rank<=a[a[root].left].size+a[root].weight) return a[root].val;
else return get_num(a[root].right,rank-a[a[root].left].size-a[root].weight);
}
int get_pre(int findnum) {//找前驱
int root=rt,num;
while(root)
{
if(a[root].val<findnum) num=a[root].val,root=a[root].right;
else root=a[root].left;
}
return num;
}
int get_next(int findnum) {//找后继
int root=rt,num;
while(root)
{
if(a[root].val>findnum) num=a[root].val,root=a[root].left;
else root=a[root].right;
}
return num;
}
int main() {
n=read();
for(int i=1;i<=n;i++)
{
int opt=read(),k=read();
if(opt==1) insert(rt,k);
if(opt==2) T_delete(rt,k);
if(opt==3) printf("%d\n",get_rank(rt,k));
if(opt==4) printf("%d\n",get_num(rt,k));
if(opt==5) printf("%d\n",get_pre(k));
if(opt==6) printf("%d\n",get_next(k));
// cout<<'\n';
// for(int i=1;i<=tot;i++)
// {
// cout<<a[i].val<<" "<<a[i].left<<" "<<a[i].right<<" "<<a[i].mix<<' '<<a[i].size<<" "<<'\n';
// }
// cout<<'\n';
}
}