#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int>v;
struct node
{
int l,r,s;
}t[N*40];
int rt[N],a[N],cnt;
int get(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}
void update(int l,int r,int x,int &y,int pos)
{
y=++cnt;t[y]=t[x];t[y].s++;
if(l==r)return;
int m=(l+r)>>1;
if(pos<=m)update(l,m,t[x].l,t[y].l,pos);
else update(m+1,r,t[x].r,t[y].r,pos);
}
int query(int l,int r,int x,int y,int num)
{
if(l==r)return l;
int sum=t[t[y].l].s-t[t[x].l].s;
int m=(l+r)>>1;
if(sum>=num)return query(l,m,t[x].l,t[y].l,num);
else return query(m+1,r,t[x].r,t[y].r,num-sum);
}
int main()
{
int n,m;int x,l,r;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",&a[i]),v.push_back(a[i]);
sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());
for(int i=1;i<=n;++i)update(1,n,rt[i-1],rt[i],get(a[i]));
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",v[query(1,n,rt[l-1],rt[r],x)-1]);
}
return 0;
}
07-22
07-22
07-22