求助
查看原帖
求助
563069
UQAQU楼主2024/8/12 17:40
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
const int N=2e5+7;
struct node{
    ll l,r,val,key,size;
}tree[N];
ll id=0,root=0,n;
int newpoint(ll v){
    tree[++id].val=v;
    tree[id].key=rand();
    tree[id].size=1;
    return id;
}
void pushup(ll p){
    tree[p].size=tree[tree[p].l].size+tree[tree[p].r].size+1;
} 
void split(ll p,ll v,ll x,ll y){
    if (!p){
        x=0,y=0;
        return ;
    }
    if (tree[p].val<=v){
        x=p;
        split(tree[x].r,v,tree[x].r,y);
    }
    else{
        y=p;
        split(tree[y].l,v,x,tree[y].l);
    }
    pushup(p);
}
int merge(ll x,ll y){
    if (!x || !y){
        return x+y;
    }
    if (tree[x].key<tree[y].key){
        tree[x].r=merge(tree[x].r,y);
        pushup(x);return x;
    }
    else{
        tree[y].l=merge(x,tree[y].l);
        pushup(y);return y;
    }
}
void insert(ll v){
    ll x,y,z;
    split(root,v,x,y);
    z=newpoint(v);
    root=merge(merge(x,z),y);    
}
void del(ll v){
    ll x,y,z;
    split(root,v,x,z);
    split(x,v-1,x,y);
    y=merge(tree[y].l,tree[y].r);
    root=merge(merge(x,y),z);
}
int getpoint(ll p,ll k){
    if (tree[tree[p].l].size>=k){
        return getpoint(tree[p].l,k);
    }
    if (tree[tree[p].l].size+1==k){
        return p;
    }
    return getpoint(tree[p].r,k-tree[tree[p].l].size-1);
}
void getpre(ll v){
    ll x,y;
    split(root,v-1,x,y);
    ll p=getpoint(x,tree[x].size);
    cout<<tree[p].val<<endl;
    root=merge(x,y);
}
void getsuc(ll v){
    ll x,y;
    split(root,v,x,y);
    ll p=getpoint(y,1);
    cout<<tree[p].val<<endl;
    root=merge(x,y); 
}
void getrank(ll v){
    ll x,y;
    split(root,v-1,x,y);
    cout<<tree[x].size+1<<endl;
    root=merge(x,y);
}
void getval(ll k){
    ll p=getpoint(root,k);
    cout<<tree[p].val<<endl;
} 
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++){
        ll opt,x;
        cin>>opt>>x;
        if (opt==1){
            insert(x);
        }
        if (opt==2){
            del(x);
        }
        if (opt==3){
            getrank(x);
        }
        if (opt==4){
            getval(x);
        }
        if (opt==5){
            getpre(x);
        }
        if (opt==6){
            getsuc(x);
        }
    }
    return 0;
}
2024/8/12 17:40
加载中...