应该是操作3和操作4出了问题```cpp #include <bits/stdc++.h> using namespace std; #define int long long
struct node { int l,r,x,val,cnt,sz; }tr[100005]; int n,id,root;
void push_up(int x) { tr[x].sz=tr[tr[x].l].sz+tr[tr[x].r].sz+tr[x].cnt; }
int new_node(int x) { // cout<<x<<endl; tr[++id].x=x; tr[id].val=rand(); tr[id].cnt=1; tr[id].sz=1; return id; }
void left(int &x) { int q=tr[x].r; tr[x].r=tr[q].l; tr[q].l=x;
x=q;
push_up(tr[x].l);
push_up(x);
}
void right(int &x) { int q=tr[x].l; tr[x].l=tr[q].r; tr[q].r=x;
x=q;
push_up(tr[x].r);
push_up(x);
}
void build() { root=new_node(-2147483647); tr[root].r=new_node(2147483647); push_up(1); }
void insert(int x,int &u) { if(!u) u=new_node(x);
else if(tr[u].x==x)
tr[u].cnt++;
else
{
// cout<<tr[x]<<endl; if(tr[u].x>x) { insert(x,tr[u].l); if(tr[tr[u].l].val>tr[u].val) right(u); }
else
{
insert(x,tr[u].r);
if(tr[tr[u].r].val>tr[u].val)
left(u);
}
}
push_up(u);
}
void del(int x,int &u) { if(!u) return;
if(tr[u].x=x)
{
if(tr[u].cnt>1)
{
tr[u].cnt--;
push_up(u);
}
else if(tr[u].l || tr[u].r)
{
if(!tr[u].r || tr[tr[u].l].val>tr[tr[u].r].val)
{
right(u);
del(x,tr[u].r);
}
else
{
left(u);
del(x,tr[u].l);
}
push_up(u);
}
else
u=0;
}
else
{
if(tr[u].x<x)
del(x,tr[u].r);
else
del(x,tr[u].l);
push_up(u);
}
}
int get_rank(int x,int u) { if(!u) return 0; if(tr[u].x==x) return tr[tr[u].l].sz+1; if(tr[u].x>x) return get_rank(x,tr[u].l); return tr[tr[u].l].sz+tr[u].cnt+get_rank(x,tr[u].r); }
int get_num(int x,int u) { if(!u) return 2147483647; if(tr[tr[u].l].sz>=x) return get_num(x,tr[u].l); if(tr[tr[u].l].sz+tr[u].cnt>=x) return tr[u].x; return get_num(x-tr[tr[u].l].sz-tr[u].cnt,tr[u].r); }
int get_fr(int x,int u) { if(!u) return -2147483647; if(tr[u].x>=x) return get_fr(x,tr[u].l); else return max(get_fr(x,tr[u].r),tr[u].x); }
int get_ba(int x,int u) { if(!u) return 2147483647; if(tr[u].x<=x) return get_ba(x,tr[u].r); else return min(get_ba(x,tr[u].l),tr[u].x); }
signed main( void ) { build(); cin>>n;
for(int i=1;i<=n;i++)
{
int opt,x;
cin>>opt>>x;
if(opt==1)
insert(x,root);
if(opt==2)
del(x,root);
if(opt==3)
cout<<get_rank(x,root)-1<<endl;
if(opt==4)
cout<<get_num(x,root+1)<<endl;
if(opt==5)
cout<<get_fr(x,root)<<endl;
if(opt==6)
cout<<get_ba(x,root)<<endl;
}
return 0;
}