#include<bits/stdc++.h>
using namespace std;
struct segtree{
int l,r,sum;
} tr[200010 * 40];
int n,m,a[200010],b[200010],cntb,cnt,root[200010 * 40];
int update(int pre,int pl,int pr,int x) {
int rt = ++cnt,mid = (pl + pr) >> 1;
tr[rt].l = tr[pre].l;
tr[rt].r = tr[pre].r;
tr[rt].sum = tr[pre].sum + 1;
if (pl == pr) return rt;
if (x <= mid) tr[rt].l = update(tr[pre].l,pl,mid,x);
else tr[rt].r = update(tr[pre].r,mid + 1,pr,x);
return rt;
}
int query(int u,int v,int pl,int pr,int k) {
if (pl == pr) return pl;
int x = tr[tr[v].l].sum - tr[tr[u].l].sum,mid = (pl + pr) >> 1;
if (x >= k) return query(tr[u].l,tr[v].l,pl,mid,k);
else query(tr[u].r,tr[v].r,mid + 1,pr,k);
}
int main() {
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i ++){
scanf("%d",&a[i]);
b[i] = a[i];
}
sort(b + 1,b + n + 1);
cntb = unique(b + 1,b + n + 1) - b - 1;
for (int i = 1;i <= cntb;i ++) {
int x = lower_bound(b + 1,b + cntb + 1,a[i]) - b;
root[i] = update(root[i - 1],1,cntb,x);
}
for (int i = 1;i <= m;i ++) {
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",b[query(root[l - 1],root[r],1,cntb,k)]);
}
return 0;
}