#include<bits/stdc++.h>
using namespace std;
struct node {
int x, l, r;
}tree[(1 << 4) * 100000];
int root[200200], tot;
int setup(int id) {
++tot;
tree[tot] = tree[id];
return tot;
}
int build (int l, int r) {
int id = ++tot;
if(l == r) {
tree[id].x = 0;
return tot;
}
int mid = (l + r) >> 1;
tree[id].l = build(l, mid);
tree[id].r = build(mid + 1, r);
return id;
}
int update(int id, int l, int r, int u) {
id = setup(id);
++tree[id].x;
if(l == r){
return id;
}
int mid = (l + r) >> 1;
if(u <= mid)
tree[id].l = update(tree[id].l, l, mid, u);
else
tree[id].r = update(tree[id].r, mid + 1, r, u);
return id;
}
int query(int idl, int idr, int l, int r, int u) {
if(l == r) return l;
int mid = (l + r) >> 1;
int k = tree[idr].x - tree[idl].x;
if(u <= k)
return query(tree[idl].l, tree[idr].l, l, mid, u);
else
return query(tree[idl].r, tree[idr].r, mid + 1, r, u - k);
}
int a[200100], b[200100];
int n, m;
int get_(int x) {
return lower_bound(b + 1, b + m + 1, x) - b;
}
int main () {
int i; int Q;
scanf ("%d %d", &n, &Q);
for (i = 1; i <= n; ++i) scanf ("%d", &a[i]), b[i] = a[i];
sort(b + 1, b + n + 1);
m = unique(b + 1, b + n + 1) - b - 1;
root[0] = build(1, n);
for (i = 1; i <= n; ++i)
root[i] = update(root[i - 1], 1, n, get_(a[i]));
while (Q--) {
int l, r, k;
scanf ("%d %d %d", &l, &r, &k);
printf ("%d\n", b[query(root[l - 1], root[r], 1, n, k)]);
}
}