解题思路:
主席树模板题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<cctype>
#include<queue>
using namespace std;
const int N=1e5+5,NLogN=N*20;
int n,m,Q,a[N],b[N],rt[N];
struct node
{
int lc,rc,sum;
} tr[NLogN];
int pool=0;
inline void disc_init()
{
sort(b+1,b+m+1);
m=unique(b+1,b+m+1)-b-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+m+1,a[i])-b;
}
inline void insert(int y,int &x,int l,int r,int p)
{
tr[x=++pool]=tr[y];
++tr[x].sum;
if(l==r)return;
int mid=l+r>>1;
if(p<=mid)insert(tr[y].lc,tr[x].lc,l,mid,p);
else insert(tr[y].rc,tr[x].rc,mid+1,r,p);
}
inline int query(int nl,int nr,int l,int r,int k)
{
if(l==r)return l;
int delta=tr[tr[nr].lc].sum-tr[tr[nl].lc].sum;
int mid=l+r>>1;
if(delta>=k)return query(tr[nl].lc,tr[nr].lc,l,mid,k);
else return query(tr[nl].rc,tr[nr].rc,mid+1,r,k-delta);
}
inline void tree_init()
{
for(int i=1;i<=n;i++)
insert(rt[i-1],rt[i],1,m,a[i]);
}
int main()
{
//freopen("lx.in","r",stdin);
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[++m]=a[i];
}
disc_init();
tree_init();
for(int i=1;i<=Q;i++)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
cout<<b[query(rt[l-1],rt[r],1,m,k)]<<'\n';
}
return 0;
}