#include "bits/stdc++.h"
using namespace std;
struct node {
int l, r, m, v;
node *lc, *rc;
node(int _l, int _r): l(_l), r(_r), m((_l + _r) >> 1) {
if (l != r) {
lc = new node(l, m);
rc = new node(m + 1, r);
}
}
void update(int n, int _v) {
if (l == r) {
v = _v;
return;
}
if (n <= m) lc -> update(n, _v);
else rc -> update(n, _v);
v = max(lc -> v, rc -> v);
}
int query(int _l, int _r) {
if (_r < _l) return 0;
if (l == _l && r == _r) return v;
if (_r <= m) return lc -> query(_l, _r);
if (_l > m) return rc -> query(_l, _r);
return max(lc -> query(_l, m), rc -> query(m + 1, _r));
}
} *root;
int main() {
int N, Q, l, r, k;
cin >> N >> Q;
vector<int> W(N + 1), A, B;
for (int i = 1; i <= N; i++) cin >> W[i];
A = B = W;
sort(B.begin(), B.end());
B.erase(unique(B.begin(), B.end()), B.end());
for (int i = 0; i < N; i++) A[i] = 1 + lower_bound(B.begin(), B.end(), W[i]) - B.begin();
while (Q--) {
cin >> l >> r >> k;
root = new node(1, N);
bool possible = true;
for (int i = l; i <= r; i++) {
root -> update(A[i], W[i]);
if (i != l) {
if (root -> query(A[i] + 1, N) + W[i] > k) {
possible = false;
break;
}
}
}
cout << (possible ? "1\n" : "0\n");
}
}