#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> W, die;
struct node {
int s, e, m, v;
node* l, * r;
node(int _s, int _e) : s(_s), e(_e), m((_s + _e) / 2), v(0) {
if (s == e) v = W[s];
else {
l = new node(s, m), r = new node(m + 1, e);
v = min(l->v, r->v);
}
}
int qry(int a, int b) {
if (b < s || a > e) return INT_MAX;
if (a <= s && b >= e) return v;
return min(l->qry(a, b), r->qry(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;
vector<pair<int, int>> vals;
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);
vals.push_back({ a, i });
}
sort(vals.begin(), vals.end(), greater<pair<int, int>>());
root = new node(0, N - 1);
vector<pair<pair<int, int>, pair<int, int>>> quers;
for (int i = 0; i < M; i++) {
cin >> a >> b >> c; a--, b--;
quers.push_back({ {c - root->qry(a, b), i}, {a, b} });
}
sort(quers.begin(), quers.end(), greater<pair<pair<int, int>, pair<int, int>>>());
auto iter = vals.begin();
set<int> idxs;
vector<int> died(M, 0);
for (int i = 0; i < M; i++) {
while (iter != vals.end() && iter->first > quers[i].first.first) {
idxs.insert(iter->second);
iter++;
}
auto iter1 = idxs.lower_bound(quers[i].second.first);
if (iter1 == idxs.end() || *iter1 > quers[i].second.second) continue;
if (lower_bound(die.begin(), die.end(), *iter1) == lower_bound(die.begin(), die.end(), quers[i].second.second)) continue;
died[quers[i].first.second] = 1;
}
for (int i : died) cout << 1 - i << '\n';
}