#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int h[100005],pp[100005],root[100005];
int n,m,cnt,ans;
struct node{int l,r,sum;};
node tree[5000005];
int erfen(int num)
{
int l=1,r=ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(pp[mid]==num) return mid;
else if(pp[mid]>num) r=mid-1;
else l=mid+1;
}
return 0;
}
void init()
{
cnt=tree[0].sum=tree[0].l=tree[0].r=0;root[0]=0;
}
void add(int l,int r,int &x,int y,int pos)
{
tree[++cnt]=tree[y];tree[cnt].sum++;x=cnt;
if(l==r) return ;
int mid=(l+r)>>1;
if(pos<=mid) add(l,mid,tree[x].l,tree[y].l,pos);
else add(mid+1,r,tree[x].r,tree[y].r,pos);
}
int query(int l,int r,int x,int y,int k)
{
if(l==r) return l;
int sum=tree[tree[y].l].sum-tree[tree[x].l].sum;
int mid=(l+r)>>1;
if(sum<k) return query(mid+1,r,tree[x].r,tree[y].r,k-sum);
else return query(l,mid,tree[x].l,tree[y].l,k);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&h[i]),pp[i]=h[i];
sort(pp+1,pp+1+n);
ans=0;
for(int i=1;i<=n;i++) if(pp[i]!=pp[i-1]) pp[++ans]=pp[i];
init();
for(int i=1;i<=n;i++)
{
add(1,n,root[i],root[i-1],erfen(h[i]));
}
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",pp[query(1,n,root[a-1],root[b],c)]);
}
return 0;
}