#include<bits/stdc++.h>
#define int long long
using namespace std;
int st[4000020], lazy[4000020];
void update(int node, int l, int r, int tl, int tr, int v)
{
if(l > tr || r < tl) return;
if(l >= tl && r <= tr) lazy[node] += v;
else{
update(node*2, l, (l+r)/2, tl, tr, v);
update(node*2+1, (l+r)/2+1, r, tl, tr, v);
st[node] = max(st[node*2] + lazy[node*2], st[node*2+1] + lazy[node*2+1]);
}
}
int query(int node, int l, int r, int tl, int tr)
{
if(l > tr || r < tl) return -1e18;
if(l >= tl && r <= tr) return st[node] + lazy[node];
else return max(query(node*2, l, (l+r)/2, tl, tr), query(node*2+1, (l+r)/2+1, r, tl, tr)) + lazy[node];
}
vector<pair<int, int>> queries[1000005];
vector<int> ad[1000005];
int a[1000005], tout[1000005], ans[1000005];
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, q; cin>>n>>q;
for(int i = 1; i <= n; i++) cin>>a[i];
a[0] = 3e9;
stack<int> cur; cur.push(0);
for(int i = 1; i <= n; i++){
while(a[cur.top()] <= a[i]){
tout[cur.top()] = i; cur.pop();
}
ad[cur.top()].push_back(i);
cur.push(i);
}
while(cur.size() > 0){
tout[cur.top()] = n; cur.pop();
}
for(int test = 1; test <= q; test++){
int l, r, x; cin>>l>>r>>x;
ans[test] = x; queries[l].push_back({r, test});
}
for(int i = 1; i <= n; i++) update(1, 1, n, i, i, a[i] + a[0]);
for(int i = 0; i <= n; i++){
//Solve all current queries
update(1, 1, n, i, i, -1e18);
for(pair<int, int> j : queries[i]) ans[j.second] -= query(1, 1, n, i, j.first);
for(int v : ad[i]){
update(1, 1, n, v, tout[v], -a[i] + a[v]);
}
}
for(int i = 1; i <= q; i++){
//cerr<<"A"<<ans[i]<<endl;
if(ans[i] >= 0) cout<<1<<'\n';
else cout<<0<<'\n';
}
}