#include <bits/stdc++.h>
#define mid (l + r >> 1)
#define ll long long
#define ull unsigned long long
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define MAX 1000005
#define MOD 1000000007
#define FI first
#define SE second
#define PII pair<int,int>
#define PB push_back
#define de(x) cout<<"de : "<<x<<endl;
using namespace std;
const int N = 4E6+500,M = 6E5+10;
int n,m,id[N],a[N],sum[N];
vector<int > vec;
int tot,VER[N],L[N],R[N];
int inline build(int l,int r)
{
int rt = ++tot;
if(l<r)
{
L[rt] = build(l,mid);
R[rt] = build(mid+1,r);
}
return rt;
}
int inline update(int pre,int l,int r,int x)
{
int rt = ++tot;
L[rt] = L[pre];
R[rt] = R[pre];
sum[rt] = sum[pre] + 1;
if(l<r)
{
if(x<=mid) L[rt] = update(L[pre],l,mid,x);
else R[rt] = update(R[pre],mid+1,r,x);
}
return rt;
}
int inline query(int ver1,int ver2,int l,int r,int k)
{
if(l==r) return l;
int d = sum[L[ver2]]-sum[L[ver1]];
if(k<=d) return query(L[ver1],L[ver2],l,mid,k);
return query(R[ver1],R[ver2],mid+1,r,k-d);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
repd(i,1,n)
{
cin>>a[i];
vec.PB(a[i]);
}
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end());
int len = vec.size();
repd(i,1,n) id[i] = lower_bound(vec.begin(),vec.end(),a[i]) - vec.begin();
VER[0]=build(0,len-1);
repd(i,1,n)
VER[i] = update(VER[i-1],0,len-1,id[i]);
repd(i,1,m)
{
int le,ri,kk;
cin>>le>>ri>>kk;
cout<<vec[query(VER[le-1],VER[ri],0,len-1,kk)]<<endl;
}
return 0;
}