#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
struct node {
int s,e,m,val;
node *l,*r;
node(int _s, int _e) {
s=_s,e=_e,m=(s+e)/2;
val=0;
if(s!=e){
l=new node(s,m);
r=new node(m+1,e);
}
}
void update(int x, int v) {
if(s==e) {
val=v;
return;
}
if(x<=m)l->update(x,v);
else r->update(x,v);
val=max(l->val,r->val);
}
int qry(int x, int y) {
if(s==x&&e==y)return val;
else if(y<=m)return l->qry(x,y);
else if(x>m)return r->qry(x,y);
else return max(l->qry(x,m),r->qry(m+1,y));
}
}*root;
signed main() {
int n,q; cin>>n>>q;
vector<int> a(n);
for(int i=0;i<n;i++) cin>>a[i];
stack<pii> s;
unordered_map<int,vector<pair<pii,int>>> queries;
for(int i=0;i<q;i++) {
int l,r,k; cin>>l>>r>>k; l--; r--;
queries[r].push_back({{l,k},i});
}
vector<int> max_inv; max_inv.assign(n,0);
root = new node(0,n-1);
for(int i=0;i<n;i++) root->update(i,0);
bool ans[q];
for(int i=0;i<n;i++) {
while(!s.empty() && s.top().first<=a[i]) {
s.pop();
}
if(!s.empty()) {
max_inv[s.top().second] = max(max_inv[s.top().second], s.top().first + a[i]);
root->update(s.top().second, max_inv[s.top().second]);
}
s.push({a[i],i});
for(pair<pii,int> query: queries[i]) {
int l = query.first.first, k = query.first.second, idx = query.second;
int mx = root->qry(l,i);
if(mx>k) ans[idx]=false;
else ans[idx]=true;
}
}
for(int i=0;i<q;i++) cout<<ans[i]<<"\n";
return 0;
}