权值线段树模板

const int M=1e6;
#define ls p<<1
#define rs p<<1|1
int a[M];
int b[M];
struct node{
    int l,r;
    int cnt;
}tr[M<<2];

void pull(int p){tr[p].cnt=tr[ls].cnt+tr[rs].cnt;}
void build(int p,int l,int r){
    tr[p].l=l;tr[p].r=r;
    if(l==r){tr[p].cnt=0;return;}
    int mid=l+r>>1;
    build(ls,l,mid);build(rs,mid+1,r);
    pull(p);
}
void ins(int p,int x,int k){
    if(tr[p].l==tr[p].r){tr[p].cnt+=k;return;}
    int mid=tr[p].l+tr[p].r>>1;
    if(x>mid)ins(rs,x,k);
    else ins(ls,x,k);
    pull(p);
}
int qr_range(int p,int l,int r){
    if(l>r)return 0;
    if(l<=tr[p].l&&tr[p].r<=r)return tr[p].cnt;
    int mid=tr[p].l+tr[p].r>>1;
    if(r<=mid)return qr_range(ls,l,r);
    else if(l>mid)return qr_range(rs,l,r);
    else if(l<=mid&&r>mid)return qr_range(ls,l,r)+qr_range(rs,l,r);
}
int qr(int x){
    int p=lower_bound(b+1,b+1+cnt,x)-b;
    if(p<=cnt&&b[p]==x)return p;
    else return p-1;
}
int rk(int p,int q){
    if(tr[p].l==tr[p].r){
        return tr[p].l;
    }
    if(tr[ls].cnt>=q){
        return rk(ls,q);
    }
    else{
        return rk(rs,q-tr[ls].cnt);
    }
}
void solve(){
    cin>>n;
    cnt=0;
    vector<pii>qrr(n+1);
    rep(i,1,n)cin>>qrr[i].fi>>qrr[i].se,a[i]=qrr[i].se;
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        if(i==1||a[i]!=a[i-1])b[++cnt]=a[i];
    }
    build(1,1,cnt);


    rep(i,1,n){
        auto[opt,x]=qrr[i];
        if(opt==1)ins(1,qr(x),1);
        else if(opt==2)ins(1,qr(x),-1);
        else if(opt==3){
            cout<<qr_range(1,1,qr(x-1))+1<<endl;
        }else if(opt==4){
            cout<<b[rk(1,x)]<<endl;
        }else if(opt==5){
            int rkx=qr_range(1,1,qr(x-1));
            cout<<b[rk(1,rkx)]<<endl;
        }else if(opt==6){
            int rkx=qr_range(1,1,qr(x));
            cout<<b[rk(1,rkx+1)]<<endl;
        }
    }

}
posted @ 2025-09-23 20:50  Marinaco  阅读(13)  评论(0)    收藏  举报
//雪花飘落效果