#include<bits/stdc++.h>
#define re register
#define mod 998244353
#define inf 0x7f7f7f7f
#define MAXN 1000100
#define mid (l+r)/2
#define int long long
using namespace std;
template < typename T > inline void read( T &x )
{
x = 0 ; int w = 1 ; char ch = getchar() ;
while( ! isdigit( ch ) ) { if( ch == '-' ) w = -1 ; ch = getchar() ; }
while( isdigit( ch ) ) x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ) , ch = getchar() ;
x *= w ;
return ;
}
template < typename T > inline void write( T x )
{
if( x < 0 )
putchar('-') , x = -x ;
if( x == 0 )
{
putchar('0') ;
return ;
}
if( x > 9 )
write( x / 10 ) ;
putchar( x % 10 + '0' ) ;
return ;
}
int sum[MAXN<<5],L[MAXN<<5],R[MAXN<<5],cnt;
inline int build(int l,int r)
{
int rt=++cnt;
sum[rt]=0;
if(l<r)
{
L[rt]=build(l,mid);
R[rt]=build(mid+1,r);
}
return rt;
}
inline int update(int p,int l,int r,int x)
{
int rt=++cnt;
L[rt]=L[p],R[rt]=R[p],sum[rt]=sum[p]+1;
if(l<r)
{
if(x<=mid) L[rt]=update(L[p],l,mid,x);
else R[rt]=update(R[p],mid+1,r,x);
}
return rt;
}
inline int query(int u,int v,int l,int r,int k)
{
if(l==r)
return l;
int x=sum[L[v]]-sum[L[u]];
if(x>=k) return query(L[u],L[v],l,mid,k);
else return query(R[u],R[v],mid+1,r,k-x);
}
int n,m,q,root[MAXN],a[MAXN],b[MAXN];
signed main()
{
read(n),read(m);
for(int i=1;i<=n;i++)
{
read(a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
q=unique(b+1,b+1+n)-b-1;
root[0]=build(1,q);
for(int i=1;i<=n;i++)
{
int t=lower_bound(b+1,b+1+q,a[i])-b;
root[i]=update(root[i-1],1,q,t);
}
for(int i=1;i<=m;i++)
{
int x,y,z;
read(x),read(y),read(z);
int t=query(root[x-1],root[y],1,q,z);
write(b[t]);putchar('\n');
}
return 0 ;
}