#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
using ll = long long;
#define int ll
using ii = pair<int, int>;
using iii = pair<ii, int>;
constexpr int INF = 1e18 + 5;
constexpr int MAXN = 1'000'000 + 5;
constexpr int MOD = 1e9 + 7;
struct FST {
FST(int init = 0) {
fill(vals, vals + MAXN * 2, init);
}
void point_upd(int p, int v) {
vals[p += MAXN] = v;
for (; p > 1; p >>= 1) vals[p >> 1] = max(vals[p], vals[p ^ 1]);
}
int range_qry(int l, int r) {
int ans = -INF;
for (l += MAXN, r += MAXN + 1; l < r; l >>= 1, r >>= 1) {
if (l & 1) ans = max(ans, vals[l++]);
if (r & 1) ans = max(ans, vals[--r]);
}
return ans;
}
int vals[MAXN * 2];
};
FST fstIdx(-1);
FST fstAns(0);
signed main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int N, M; cin >> N >> M;
vector<int> A(N); for (int i = 0; i < N; ++i) cin >> A[i];
vector<int> disc = A; sort(disc.begin(), disc.end());
for (int i = 0; i < N; ++i) {
A[i] = lower_bound(disc.begin(), disc.end(), A[i]) - disc.begin();
}
vector<bool> ans(M);
vector<vector<iii>> queriesEndingAt(N);
for (int i = 0; i < M; ++i) {
int l, r, k; cin >> l >> r >> k;
l--, r--;
queriesEndingAt[r].emplace_back(ii{l, k}, i);
}
for (int i = 0; i < N; ++i) {
int idx = fstIdx.range_qry(A[i] + 1, MAXN - 1);
if (idx != -1) {
fstAns.point_upd(idx, disc[A[i]] + disc[A[idx]]);
}
fstIdx.point_upd(A[i], i);
for (auto [query, qidx] : queriesEndingAt[i]) {
auto [l, k] = query;
ans[qidx] = fstAns.range_qry(l, i) <= k;
// cout << "queried " << l << " " << i << ", got " << fstAns.range_qry(l, i) << ", k is " << k << '\n';
}
/*
cout << "at " << i << '\n';
for (int j = 0; j <= i; ++j) cout << fstAns.range_qry(j, j) << ' ';
cout << '\n';
for (int j = 0; j < N; ++j) cout << fstIdx.range_qry(j, j) << ' ';
cout << '\n';
*/
}
for (int i = 0; i < M; ++i) cout << ans[i] << '\n';
}