主席树模板

#include<bits/stdc++.h>
using namespace std;

const int MAXN=2e5+2333;

int n,m,cnt,all,a[MAXN],b[MAXN];
int rt[MAXN<<4],t[MAXN<<4],L[MAXN<<4],R[MAXN<<4];

int getnumber(int x){
    return lower_bound(b+1,b+all+1,x)-b;
}
void update(int &now,int lst,int l,int r,int q){
    t[now=++cnt]=t[lst]+1;
    if (l==r) return;
    int mid=l+r>>1;
    if (q<=mid) R[now]=R[lst],update(L[now],L[lst],l,mid,q);
    else L[now]=L[lst],update(R[now],R[lst],mid+1,r,q);
}

int query(int ql,int qr,int l,int r,int k) {
    if (l==r) return b[l];
    int mid=l+r>>1,tmp=t[L[qr]]-t[L[ql]];
    return tmp>=k ? query(L[ql],L[qr],l,mid,k):query(R[ql],R[qr],mid+1,r,k-tmp);
}

int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar();}
    while (isdigit(ch)) x=x*10+ch-48,ch=getchar();
    return x*f;
}

int main(){
    n=read(),m=read();
    for (int i=1;i<=n;i++)
        b[i]=a[i]=read();
    sort(b+1,b+n+1);
    all=unique(b+1,b+n+1)-b-1;
    for (int i=1;i<=n;i++)
        update(rt[i],rt[i-1],1,all,getnumber(a[i]));
    int x,y,z;
    while (m--){
        x=read(),y=read(),z=read();
        printf("%d\n",query(rt[x-1],rt[y],1,all,z));
    }
    return 0;
}
posted @ 2018-08-24 12:21  QingCai_DCF  阅读(140)  评论(0编辑  收藏  举报