RT,样例过了,但依旧爆零。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000005;
const ll INF=2147483647;
struct Node{
ll l,r,size,cnt,val;
}t[N];
ll q,countt;
void add(ll u,ll p){//插入
t[u].size++;
if(t[u].val==p){
t[u].cnt++;
return;
}
if(t[u].val>p){
if(t[u].l!=0){
add(t[u].l,p);
}
else{
countt++;
t[countt].val=p;
t[countt].cnt=t[countt].size=1;
t[u].l=countt;
}
}
else{
if(t[u].r!=0){
add(t[u].r,p);
}
else{
countt++;
t[countt].val=p;
t[countt].cnt=t[countt].size=1;
t[u].r=countt;
}
}
}
ll qq (ll x,ll val,ll ans){//找前驱
if(t[x].val>=val){
if(t[x].l)qq(t[x].l,val,ans);
else return ans;
}
else{
if(t[x].r==0)return (t[x].val<val)?t[x].val:ans;
if(t[x].cnt!=0)qq(t[x].r,val,t[x].val);
else qq(t[x].r,val,ans);
}
}
ll hj (ll x,ll val,ll ans){//找后继
if(t[x].val<=val){
if(t[x].r)hj(t[x].r,val,ans);
else return ans;
}
else{
if(t[x].l==0)return (t[x].val>val)?t[x].val:ans;
if(t[x].cnt!=0)hj(t[x].l,val,t[x].val);
else hj(t[x].l,val,ans);
}
}
ll ask(ll p,ll x){//按照值找排名
if(p==0)return 0;
if(t[p].val==x)return t[t[p].l].size;
if(t[p].val>x)return ask(t[p].l,x);
return ask(t[p].r,x)+t[t[p].l].size+t[p].cnt;
}
ll ksa(ll p,ll x){//按照排名找值
if(p==0)return INF;
if(t[t[p].l].size>x){
return ksa(t[p].l,x);
}
if(t[t[p].l].size+t[p].cnt>=x){
return t[p].val;
}
return ksa(t[p].r,x-t[t[p].l].size-t[p].cnt);
}
int main(){
scanf("%lld",&q);
for(int i=1;i<=q;i++){
ll b,x;scanf("%lld%lld",&b,&x);
if(b==1){
printf("%lld\n",ask(1,x)+1);
}
else if(b==2){
printf("%lld\n",ksa(1,x));
}
else if(b==3){
printf("%lld\n",qq(1,x,-INF));
}
else if(b==4){
printf("%lld\n",hj(1,x,INF));
}
else{
if(countt==0){
countt++;
t[countt].size=t[countt].cnt=1;
t[countt].val=x;
}
else add(1,x);
}
}
return 0;
}