主席树(区间第k大值)

inline void build(int &k,int l,int r){
    k=node_cnt++;
    if(l==r) return;
    int mid=(l+r)/2;
    build(lc[k],l,mid);
    build(rc[k],mid+1,r);
}
inline int modify(int k,int l,int r){
    int oo=++node_cnt;
    lc[oo]=lc[k];rc[oo]=rc[k];sum[oo]=sum[k]+1;
    if(l==r) return oo;
    int mid=(l+r)/2;
    if(p<=mid) lc[oo]=modify(lc[oo],l,mid);
    else rc[oo]=modify(rc[oo],mid+1,r);
    return oo;
}
inline int query(int u,int v,int l,int r,int k){
    int mid=(l+r)/2;
    int cnt=sum[lc[v]]-sum[lc[u]],ans;
    if(l==r) return l;
    if(cnt>=k) ans=query(lc[u],lc[v],l,mid,k);
    else ans=query(rc[u],rc[v],mid+1,r,k-cnt);
    return ans;
}

猜你喜欢

转载自www.cnblogs.com/Suiyue-Li/p/11256580.html