#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
int s,e;
ll mx, ans;
vector<ll> val;
node *l,*r;
node (int _s, int _e, ll a[]): s(_s), e(_e), mx(0), ans(0), val({}){
if (s==e) {
mx = a[s];
val.push_back(a[s]);
ans = 0;
}
else{
l = new node(s, (s+e)>>1, a), r = new node((s+e+2)>>1,e,a);
combine();
}
}
void combine(){
mx = max(l->mx,r->mx);
auto it = lower_bound(r->val.begin(),r->val.end(),l->mx);
if (it==r->val.begin()){
ans = max({l->ans,r->ans});
}
else{
it--;
ans = max({l->ans,r->ans,l->mx+*it});
}
merge(l->val.begin(),l->val.end(),r->val.begin(),r->val.end(),back_inserter(val));
}
pair<ll,ll> query(int x, int y, ll currmx){
if (s==x && e==y){
auto it = lower_bound(val.begin(),val.end(),currmx);
if (it==val.begin()) return {ans,mx};
it--;
return {max({ans,currmx+*it}),mx};
}
int m = (s+e)>>1;
if (y <= m) return l->query(x,y,currmx);
if (x > m) return r->query(x,y,currmx);
pair<ll,ll> out = l->query(x,m,currmx);
pair<ll,ll> q = r->query(m+1,y,out.second);
return {max(out.first,q.first),max(out.second,q.second)};
}
~node(){
delete l;
delete r;
}
} *root;
int main(){
ll n,m;
cin >> n >> m;
ll w[n];
for (int i=0;i<n;i++){
cin >> w[i];
}
root = new node(0,n-1,w);
for (int i=0;i<m;i++){
ll l,r,k;
cin >> l >> r >> k;
l--;
r--;
if (root->query(l,r,0).first <= k){
cout << "1\n";
}
else cout << "0\n";
}
}