#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
const int MAXN = 1000005;
int n, m;
int w[MAXN];
long long tree[4 * MAXN];
int ans[MAXN];
struct Query {
int l, r, id;
long long k;
};
vector<Query> queries[MAXN];
void update(int node, int start, int end, int idx, long long val) {
if (start == end) {
tree[node] = max(tree[node], val);
return;
}
int mid = (start + end) / 2;
if (idx <= mid) update(2 * node, start, mid, idx, val);
else update(2 * node + 1, mid + 1, end, idx, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
long long query_tree(int node, int start, int end, int l, int r) {
if (r < start || end < l) return 0;
if (l <= start && end <= r) return tree[node];
int mid = (start + end) / 2;
return max(query_tree(2 * node, start, mid, l, r),
query_tree(2 * node + 1, mid + 1, end, l, r));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
if (!(cin >> n >> m)) return 0;
for (int i = 1; i <= n; i++) cin >> w[i];
for (int i = 0; i < m; i++) {
int l, r;
long long k;
cin >> l >> r >> k;
queries[r].push_back({l, r, i, k});
}
stack<int> s;
for (int j = 1; j <= n; j++) {
while (!s.empty() && w[s.top()] <= w[j]) {
s.pop();
}
if (!s.empty()) {
// w[s.top()] is the nearest greater element to the left
update(1, 1, n, s.top(), (long long)w[s.top()] + w[j]);
}
s.push(j);
for (auto &q : queries[j]) {
long long max_val = query_tree(1, 1, n, q.l, q.r);
ans[q.id] = (max_val <= q.k) ? 1 : 0;
}
}
for (int i = 0; i < m; i++) {
cout << ans[i] << "\n";
}
return 0;
}