#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll MAXN = 40e6, MAXV = 1073741824;
struct sec {
ll val, len;
sec(ll v = 0, ll l = 0) {
val = v;
len = l;
}
};
struct opr {
ll val;
opr(ll v = 0) {
val = v;
}
};
sec operator+(sec x, sec y) {
return sec(x.val + y.val, x.len + y.len);
}
void pas(opr x, opr& y) {
y.val += x.val;
}
void com(opr x, sec& y) {
y.val += x.val;
}
struct segTree {
ll size, rt[MAXN + 5], rtc, lc[MAXN + 5], rc[MAXN + 5];
sec val[MAXN + 5];
opr tag[MAXN + 5];
void pushdown(ll x) {
pas(tag[x], tag[lc[x]]);
com(tag[x], val[lc[x]]);
pas(tag[x], tag[rc[x]]);
com(tag[x], val[rc[x]]);
tag[x] = opr();
}
void pushup(ll x) {
val[x] = val[lc[x]] + val[rc[x]];
}
ll clone(ll x) {
ll nd = ++size;
val[nd] = val[x];
tag[nd] = tag[x];
lc[nd] = lc[x];
rc[nd] = rc[x];
return nd;
}
segTree() {
size = 1;
rt[0] = 1;
rtc = 0;
}
ll mdf(ll x, ll lx, ll rx, ll l, ll r, ll k, bool isrt) {
if (r <= lx || rx <= l) {
return x;
}
x = clone(x);
if (isrt) {
rt[++rtc] = x;
}
if (l <= lx && rx <= r) {
pas(opr(k), tag[x]);
com(opr(k), val[x]);
return x;
}
pushdown(x);
ll mid = (lx + rx) / 2;
lc[x] = mdf(lc[x], lx, mid, l, r, k, 0);
rc[x] = mdf(rc[x], mid, rx, l, r, k, 0);
pushup(x);
return x;
}
ll qry(ll li, ll ri, ll lx, ll rx, ll rk) {
if (lx + 1 == rx) {
return lx;
}
pushdown(li);
pushdown(ri);
ll mid = (lx + rx) / 2;
if (rk <= val[lc[ri]].val - val[lc[li]].val) {
return qry(lc[li], lc[ri], lx, mid, rk);
} else {
return qry(rc[li], rc[ri], mid, rx, rk - (val[lc[ri]].val - val[lc[li]].val));
}
}
} st;
ll n, q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (ll i = 1, a; i <= n; i++) {
cin >> a;
st.mdf(st.rt[i - 1], 1, MAXV + 1, a, a + 1, 1, 1);
}
while (q--) {
ll l, r, rk;
cin >> l >> r >> rk;
cout << st.qry(st.rt[l - 1], st.rt[r], 1, MAXV + 1, rk) << endl;
}
return 0;
}