#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
vector<int> W, die;
struct node {
int s, e, m, v1, v2;
node* l, * r;
node(int _s, int _e) : s(_s), e(_e), m((_s + _e) / 2) {
if (s == e) v1 = v2 = W[s];
else {
l = new node(s, m), r = new node(m + 1, e);
v1 = min(l->v1, r->v1);
v2 = max(l->v2, r->v2);
}
}
int qry1(int a, int b) {
if (b < s || a > e) return INT_MAX;
if (a <= s && b >= e) return v1;
return min(l->qry1(a, b), r->qry1(a, b));
}
int qry2(int a, int b) {
if (b < s || a > e) return 0;
if (a <= s && b >= e) return v2;
return max(l->qry2(a, b), r->qry2(a, b));
}
} *root;
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, M, a, b, c; cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> a;
W.push_back(a);
if (i > 0 && W[i] < W[i - 1]) die.push_back(i - 1);
}
root = new node(0, N - 1);
for (int i = 0; i < M; i++) {
cin >> a >> b >> c; a--, b--;
int d = c - root->qry1(a, b);
auto iter = lower_bound(die.begin(), die.end(), b);
if (iter == die.begin()) {
cout << "1\n";
continue;
}
iter--;
if (root->qry2(a, *iter) <= c) cout << "1\n";
else cout << "0\n";
}
}