#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;
const int maxn = 2e5 + 1;
long long a[maxn], b[maxn];
int tot;
struct treenode {
int lc, rc;
long long val;
treenode operator = (treenode x){
lc = x.lc;
rc = x.rc;
val = x.val;
return *this;
}
} tree[maxn * 32];
int root[maxn];
long long (*pfunc)(long long, long long);
int update(int pre, int pl, int pr, int x)
{
int rt = ++tot;
tree[rt].lc = tree[pre].lc;
tree[rt].rc = tree[pre].rc;
tree[rt].val = tree[pre].val + 1;
int mid = (pl + pr) >> 1;
if(pl < pr)
{
if(x <= mid) tree[rt].lc = update(tree[pre].lc, pl, mid, x);
else tree[rt].rc = update(tree[pre].rc, mid + 1, pr, x);
}
return rt;
}
int kthelement(int u, int v, int pl, int pr, int k)
{
if(pl == pr) return pl;
int x = tree[tree[v].lc].val - tree[tree[u].lc].val;
int mid = (pl + pr) >> 1;
if(x >= k) return kthelement(tree[u].lc, tree[v].lc, pl, mid, k);
else return kthelement(tree[u].rc, tree[v].rc, mid + 1, pr, k - x);
}
unordered_map<long long, int> discrete;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
for(int i = 0; i < n; ++ i){
cin >> a[i];
b[i] = a[i];
}
sort(a, a + n);
int s = unique(a, a + n) - a;
for(int i = 1; i <= s; ++ i)
discrete[a[i - 1]] = i;
for(int i = 1; i <= n; ++ i)
root[i] = update(root[i - 1], 1, s, discrete[a[i - 1]]);
for(int i = 0; i < m; ++ i){
int l, r, k;
cin >> l >> r >> k;
cout << a[kthelement(root[l - 1], root[r], 1, s, k) - 1] << endl;
}
}