#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define lc(x) t[x].ch[0]
#define rc(x) t[x].ch[1]
const int N = 2e5+5;
int root[N],idx;
struct Node
{
int ch[2];
int cnt;
}t[N*20];
int n,m,a[N];
vector<int>q;
int getid(int x)
{
return lower_bound(q.begin(),q.end(),x)-q.begin()+1;
}
void build(int &x,int l,int r)
{
x=++idx;
if(l==r)return;
int mid=(l+r)/2;
build(lc(x),l,mid);
build(rc(x),mid+1,r);
}
void insert(int x,int &y,int l,int r,int k)
{
y=++idx;
t[y]=t[x];
t[y].cnt++;
if(l==r)return;
int mid=(l+r)/2;
if(k<=mid)insert(lc(x),lc(y),l,mid,k);
else insert(rc(x),rc(y),mid+1,r,k);
}
int query(int x,int y,int l,int r,int k)
{
if(l==r)return l;
int mid=l+r>>1;
int s=t[lc(y)].cnt-t[lc(x)].cnt;
if(k<=s)query(lc(x),lc(y),l,mid,k);
else query(rc(x),rc(y),mid+1,r,k-s);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
q.push_back(a[i]);
}
sort(q.begin(),q.end());
q.erase(unique(q.begin(),q.end()),q.end());
int qn=q.size();
for(int i=1;i<=n;i++)
insert(root[i-1],root[i],1,qn,getid(a[i]));
while(m--)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
int id=query(root[l-1],root[r],1,qn,k)-1;
printf("%d\n",q[id]);
}
return 0;
}