主席树静态模板
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], b[maxn], T[maxn], tot;
struct node{ int l, r, sum; } tree[maxn*20];
void init()
{
tot = 0;
T[0] = 0;
tree[0].l = tree[0].r = tree[0].sum = 0;
}
void update(int num,int &rt,int l,int r)
{
tree[++tot] = tree[rt]; rt = tot;
tree[rt].sum++;
if(l == r) return ;
int mid = (l+r)>>1;
if(num <= mid) update(num,tree[rt].l,l,mid);
else update(num,tree[rt].r,mid+1,r);
}
int query(int t1,int t2,int k,int l,int r)
{
int d = tree[tree[t2].l].sum-tree[tree[t1].l].sum;
if(l == r) return l;
int mid = (l+r)>>1;
if(k <= d) query(tree[t1].l,tree[t2].l,k,l,mid);
else query(tree[t1].r,tree[t2].r,k-d,mid+1,r);
}
int main()
{
int n, q;
scanf("%d%d",&n,&q);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]), b[i] = a[i];
sort(b+1,b+n+1);
int cnt = unique(b+1,b+n+1)-b-1;
init();
for(int i = 1; i <= n; i++){
T[i] = T[i-1];
int x = lower_bound(b+1,b+cnt+1,a[i])-b;
update(x,T[i],1,cnt);
}
for(int i = 1,l,r,k; i <= q; i++){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",b[query(T[l-1],T[r],k,1,cnt)]);
}
return 0;
}