主席树模板

struct PT{
    static constexpr int N=2e5+5;
    //值域
    int up;
    vector<int>b;
    map<int,int>mp;

    int cntNodes,root[N];
    struct node{
        int l,r;
        int cnt;
    }tr[4*N+17*N];
    void modify(int &u,int v,int l,int r,int x){
        u=++cntNodes;
        tr[u]=tr[v];
        tr[u].cnt++;
        if(l==r)return;
        int mid=l+r>>1;
        if(x<=mid)modify(tr[u].l,tr[v].l,l,mid,x);
        else modify(tr[u].r,tr[v].r,mid+1,r,x);
    }
    int kth(int u,int v,int l,int r,int k){
        if(l==r)return l;
        int res=tr[tr[v].l].cnt-tr[tr[u].l].cnt;
        int mid=l+r>>1;
        if(k<=res)return kth(tr[u].l,tr[v].l,l,mid,k);
        else {
            return kth(tr[u].r,tr[v].r,mid+1,r,k-res);
        }
    }

    void init(vector<int>&a){
        //传入a(n+1)
        for(int i=1;i<a.size();i++)b.pb(a[i]);
        sort(b.begin(),b.end());
        b.erase(unique(b.begin(),b.end()),b.end());
        up=b.size();

        for(int i=1;i<a.size();i++){
            mp[a[i]]=1+lower_bound(b.begin(),b.end(),a[i])-b.begin();
        }
        for(int i=1;i<a.size();i++){
            modify(root[i],root[i-1],1,up,mp[a[i]]);
        }
    }
    int query(int l,int r,int k){
        //返回[l,r]区间第k小
        return (b[kth(root[l-1],root[r],1,up,k)-1]);
    }
}tree;
posted @ 2025-07-23 20:06  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果