#include<vector>
#include<iostream>
#include<algorithm>
#include<vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1e5 + 7;
struct node {
int l, r, sum;
}T[maxn*40];
int n, m, x, y, k, root[maxn], a[maxn],cnt;
vector<int>v;
int getid(int cur) { return lower_bound(v.begin(), v.end(), cur) - v.begin() + 1;}
void update(int l, int r, int& x, int y, int pos) {
T[++cnt] = T[y], x = cnt, T[x].sum++;
if (l == r)return;
int mid = (l + r) >> 1;
if (pos <= mid)update(l, mid, T[x].l, T[y].l, pos);
else update(mid + 1, r, T[x].r, T[y].r, pos);
}
int quare(int l, int r, int x, int y, int k) {
if (l == r)return l;
int mid = (l + r) >> 1;
//区间第k小
//int sum = T[T[y].l].sum - T[T[x].l].sum;
//if (k <= sum)return quare(l, mid, T[x].l, T[y].l, k);
//else return quare(mid + 1, r, T[x].r, T[y].r, k - sum);
//区间第k大
int sum = T[T[y].r].sum - T[T[x].r].sum;
if (k > sum)return quare(l, mid, T[x].l, T[y].l, k-sum);
else return quare(mid + 1, r, T[x].r, T[y].r, k);
}
int ans[maxn];
signed main() {
ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
while(cin>>n>>m){
v.clear();
for(int i=1;i<=n;i++){
cin>>a[i];
v.push_back(a[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i=1;i<=n;i++){
update(1,n,root[i],root[i-1],getid(a[i]));
}
for (int i = 1; i <= m; ++i) {
cin >> x >> y >> k;
cout << v[quare(1, n, root[x - 1], root[y], k) - 1] << endl;
}
}
}