#include <bits/stdc++.h>
#define hash h
using namespace std;
const int N = 1e5 + 5;
int n,q,cnt,a[N],k,hash[N],tot,tree[N],ll[32 * N],rr[32 * N],sum[32 * N],l,r;
int make_tree(int l,int r)
{
cnt++;
int p = cnt;
if(l < r)
{
ll[p] = make_tree(l,(l + r) >> 1);
rr[p] = make_tree(((l + r) >> 1) + 1,r);
}
return p;
}
int add(int pre,int l,int r,int x)
{
cnt++;
int p = cnt;
ll[p] = ll[pre],rr[p] = rr[pre],sum[p] = sum[pre] + 1;
if(l < r)
{
int mid = (l + r) >> 1;
if(x <= mid)ll[p] = add(ll[pre],l,mid,x);
else rr[p] = add(rr[pre],mid + 1,r,x);
}
return p;
}
int gets(int u,int v,int l,int r,int x)
{
if(l >= r)return l;
int mid = (l + r) >> 1;
int num = sum[ll[v]] - sum[ll[u]];
if(num >= x)return gets(ll[u],ll[v],l,mid,x);
else return gets(rr[u],rr[v],mid + 1,r,x - num);
}
int main()
{
//freopen("P3834_3.in","r",stdin);
//freopen("out.out","w",stdout);
scanf("%d %d",&n,&q);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),hash[i] = a[i];
sort(hash + 1,hash + 1 + n);
int tot = unique(hash + 1,hash + 1 + n) - hash - 1;
tree[0] = make_tree(1,tot);
for(int i=1;i<=n;i++)
{
int x = lower_bound(hash + 1,hash + 1 + n,a[i]) - hash;
tree[i] = add(tree[i - 1],1,tot,x);
}
while(q--)
{
scanf("%d %d %d",&l,&r,&k);
int x = gets(tree[l - 1],tree[r],1,tot,k);
printf("%d\n",hash[x]);
}
return 0;
}
WA了3个点: 求助各位大佬啊