主席树基本操作:静态区间第k大

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+7,MAXN=2e5+50,SIZE=MAXN*20;
int N,M,K;
int tmp[MAXN],A[MAXN],rt[MAXN],order[MAXN];
int sz,lson[SIZE],rson[SIZE],sum[SIZE];
int init(int l,int r){
    int cur=++sz;
    if(l<r){
        int mid=(l+r)>>1;
        lson[cur]=init(l,mid);
        rson[cur]=init(mid+1,r);
    }
    return cur;
}
int modify(int pre,int l,int r,int x){
    int cur=++sz;
    lson[cur]=lson[pre];
    rson[cur]=rson[pre];
    sum[cur]=sum[pre]+1;
    int mid=(l+r)>>1;
    if(l<r){
        if(x<=mid)
            lson[cur]=modify(lson[pre],l,mid,x);
        else
            rson[cur]=modify(rson[pre],mid+1,r,x);
    }
    return cur;
}
int query(int x,int y,int l,int r,int k){
    if(l==r)
        return l;
    int ii=sum[lson[y]]-sum[lson[x]],mid=(l+r)>>1;
    if(ii>=k){
        return query(lson[x],lson[y],l,mid,k);
    }else{
        return query(rson[x],rson[y],mid+1,r,k-ii);
    }
}
int main(){
    scanf("%d%d",&N,&K);
    for(int i=1;i<=N;i++){
        scanf("%d",tmp+i);
        A[i]=tmp[i];
    }
    sort(A+1,A+N+1);
    int M=unique(A+1,A+N+1)-A-1;
    rt[0]=init(1,M);
    for(int i=1;i<=N;i++){
        order[i]=lower_bound(A+1,A+M+1,tmp[i])-A;
        rt[i]=modify(rt[i-1],1,M,order[i]);
    }
    while(K--){
        int ii,jj,kk;
        scanf("%d%d%d",&ii,&jj,&kk);
        printf("%d\n",A[query(rt[ii-1],rt[jj],1,M,kk)]);
    }
    return 0;
}
模板代码

相关文章:

  • 2021-11-21
  • 2021-09-02
  • 2021-10-18
  • 2022-12-23
  • 2021-05-29
猜你喜欢
  • 2021-09-21
  • 2022-12-23
  • 2021-10-12
  • 2022-02-21
  • 2022-02-03
  • 2020-05-15
  • 2020-10-16
相关资源
相似解决方案