// Author: Teoman Ata Korkmaz
#pragma GCC optimize("O3,unroll-loops,inline,no-stack-protector")
#include <bits/stdc++.h>
#define int int32_t
using namespace std;
struct segtree{
struct Node{
int mn;
int mx;
int ans;
};
int n;
vector<Node> st;
segtree(const vector<int>& v){
n=v.size();
st.resize(4*n);
build(1,n,1,v);
}
Node merge(const Node& l,const Node& r){
return {
.mn=min(l.mn,r.mn),
.mx=max(l.mx,r.mx),
.ans=max({l.ans,r.ans,(l.mx>r.mn?l.mx+r.mn:0)})
};
}
void build(int l,int r,int node,const vector<int>& v){
if(l==r){
st[node]={
.mn=v[l-1],
.mx=v[l-1],
.ans=0
};
return;
}
int m=(l+r)/2;
build(l,m,node<<1,v);
build(m+1,r,node<<1|1,v);
st[node]=merge(st[node<<1],st[node<<1|1]);
}
Node query(int l,int r,int node,int qx,int qy){
if(qx<=l && r<=qy)return st[node];
if(qy<l || r<qx)return {
.mn=1'010'000'000,
.mx=-1'010'000'000,
.ans=-1'010'000'000
};
int m=(l+r)/2;
return merge(
query(l,m,node<<1,qx,qy),
query(m+1,r,node<<1|1,qx,qy)
);
}
int query(int l,int r){
return query(1,n,1,l,r).ans;
}
};
///////////////////////////////////////////////////////////
int n,q;
vector<int> v;
signed main(void){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>q;
v.resize(n);
for(int& i:v)cin>>i;
segtree st(v);
while(q--){
int x,y,z;
cin>>x>>y>>z;
cout<<(st.query(x,y)>z ? '0' : '1')<<'\n';
}
}