#include <bits/stdc++.h>
#define maxn 300010
#define inf 2000000005
using namespace std;
typedef long long ll;
int sum = 0, rt = 0;
int size[maxn];
int v[maxn];
int num[maxn];
int rd[maxn];
int son[maxn][2];
int a[maxn];
struct node {
int l, r, k, rank;
bool operator < (const node &a) const {
return (a.l == l) ? (r < a.r) : (l < a.l);
}
} b[maxn];
int add(int val) {
v[++sum] = val;
size[sum] = 1;
num[sum] = 1;
rd[sum] = rand();
return sum;
}
void pushup(int p) {
size[p] = size[son[p][0]] + size[son[p][1]] + num[p];
}
void rotate(int &p, int d) {
int k = son[p][d ^ 1];
son[p][d ^ 1] = son[k][d];
son[k][d] = p;
pushup(p);
pushup(k);
p = k;
}
void ins(int &p, int x) {
if (!p) {
p = add(x);
return;
}
if (v[p] == x) {
num[p]++;
size[p]++;
return;
}
int d = (x < v[p]);
ins(son[p][d], x);
if (rd[p] < rd[son[p][d]])
rotate(p, d ^ 1);
pushup(p);
}
void del(int &p, int x) {
if (!p)
return;
if (x < v[p])
del(son[p][0], x);
else if (x > v[p])
del(son[p][1], x);
else {
if (!son[p][1] && !son[p][0]) {
num[p]--;
size[p]--;
if (num[p] == 0)
p = 0;
} else if (son[p][0] && !son[p][1]) {
rotate(p, 1);
del(son[p][1], x);
} else if (son[p][1] && !son[p][0]) {
rotate(p, 0);
del(son[p][0], x);
} else if (son[p][0] && son[p][1]) {
int d = (rd[son[p][0]] > rd[son[p][1]]);
rotate(p, d);
del(son[p][d], x);
}
}
pushup(p);
}
int _rank(int p, int x) {
if (!p)
return 1;
if (v[p] == x)
return size[son[p][0]] + 1;
if (v[p] > x)
return size[son[p][0]] + num[p] + _rank(son[p][1], x);
if (v[p] < x)
return _rank(son[p][0], x);
}
int find(int p, int x) {
if (!p)
return 0;
if (size[son[p][0]] >= x)
return find(son[p][0], x);
else if (size[son[p][0]] + num[p] < x)
return find(son[p][1], x - num[p] - size[son[p][0]]);
else
return v[p];
}
int pre(int p, int x) {
if (!p)
return -inf;
if (v[p] >= x)
return pre(son[p][0], x);
else
return max(v[p], pre(son[p][1], x));
}
int suc(int p, int x) {
if (!p)
return inf;
if (v[p] <= x)
return suc(son[p][1], x);
else
return min(v[p], suc(son[p][0], x));
}
template<typename T>inline void read(T &ff) {
T rr = 1;
ff = 0;
register char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-')
rr = -1;
ch = getchar();
}
while (isdigit(ch)) {
ff = (ff << 1) + (ff << 3) + (ch ^ 48);
ch = getchar();
}
ff *= rr;
}
int l, r, k;
int ans[maxn];
int main() {
rd[0] = -1;
int n, m;
read(n);
read(m);
for (register int i = 1; i <= n; i++) {
read(a[i]);
}
for (register int i = 1; i <= m; i++) {
read(b[i].l);
read(b[i].r);
read(b[i].k);
b[i].rank = i;
}
sort(b + 1, b + m + 1);
int head = 1, tail = 0;
for (int i = 1; i <= m; i++) {
while (tail < b[i].r)
ins(rt, add(a[++tail]));
while (head < b[i].l)
del(rt, a[head++]);
ans[b[i].rank] = v[find(rt, b[i].k)];
}
for (int i = 1; i <= m; i++) {
cout << ans[i] << endl;
}
return 0;
}