#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> ii;
vector<int> segtree;
void upd(int node, int tl, int tr, int p, int val) {
if (tl == tr) {
segtree[node] = max(segtree[node], val);
return;
}
int tm = (tl + tr) / 2;
if (p <= tm) {
upd(node * 2, tl, tm, p, val);
} else {
upd(node * 2 + 1, tm + 1, tr, p, val);
}
segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
int query(int node, int tl, int tr, int l, int r) {
if (l > tr || r < tl)
return 0;
if (l <= tl && r >= tr) {
return segtree[node];
}
int tm = (tl + tr) / 2;
return max(query(node * 2, tl, tm, l, r),
query(node * 2 + 1, tm + 1, tr, l, r));
}
int main() {
int n, m;
cin >> n >> m;
vector<int> books(n, 0);
for (int i = 0; i < n; ++i) {
cin >> books[i];
}
segtree = vector<int>(4 * n + 10, 0);
stack<int> inversions;
int l, r, mood;
priority_queue<pair<ii, ii>, vector<pair<ii, ii>>, greater<pair<ii, ii>>>
queries;
for (int i = 0; i < m; ++i) {
cin >> l >> r >> mood;
--l, --r;
queries.emplace(ii(r, l), ii(mood, i));
}
vector<int> ans(m, 0);
for (int i = 0; i < n; ++i) {
while (!inversions.empty() && books[inversions.top()] < books[i]) {
inversions.pop();
}
if (!inversions.empty()) {
upd(1, 0, n, inversions.top(), books[inversions.top()] + books[i]);
}
inversions.push(i);
while (!queries.empty() && queries.top().first.first == i) {
ans[queries.top().second.second] =
(query(1, 0, n, queries.top().first.second,
queries.top().first.first) <= queries.top().second.first);
queries.pop();
}
}
for (auto e : ans) {
cout << e << '\n';
}
return 0;
}