#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
// count numbers of inversions using st
const int maxn = 1e6 + 5;
struct node{
int inv;
vector<int> arr;
node(int in, vector<int> ar): inv(in), arr(ar) {}
node(){
inv = 0;
}
} st[4*maxn+5];
node comb(const node &a, const node &b){
// perform merge sort
int n = a.arr.size(), m = b.arr.size();
int i = 0, j = 0;
vector<int> comb;
int inv = a.inv + b.inv;
while(i < n && j < m){
if (a.arr[i] > b.arr[j]){
// inv exists, j forms inv pair from i to n-1
inv += n-i;
comb.push_back(b.arr[j]);
j++;
}
else{
comb.push_back(a.arr[i]);
i++;
}
}
while(j < m){
comb.push_back(b.arr[j]);
j++;
}
while (i < n){
// inv exists, every m forms inv pair with i
inv += m;
comb.push_back(a.arr[i]);
i++;
}
return node(inv, comb);
}
void build(int id, int l, int r, vector<int> &a){
if (l == r){
vector<int> tmp(1, a[l]);
st[id] = node(0, tmp);
return;
}
int mid = (l + r)/2;
build(id*2, l, mid, a);
build(id*2+1, mid+1, r, a);
st[id] = comb(st[id*2], st[id*2+1]);
}
node get(int id, int l, int r, int ul, int ur){
if (l > ur || r < ul) return node(0, vector<int>());
if (ul <= l && r <= ur) return st[id];
int mid = (l + r)/2;
return comb(get(id*2, l, mid, ul, ur), get(id*2+1, mid+1, r, ul, ur));
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<int> bk(n+1);
for (int i = 1; i <= n; i++){
cin >> bk[i];
}
build(1, 1, n, bk);
while(q--){
int u, v, k;
cin >> u >> v >> k;
// for each query determine whether the largest swap >= k or not
// sub 3, basically checking if subarray is sorted
int why = get(1, 1, n, u, v).inv;
if (why == 0){
cout << 1 << endl;
}
else cout << 0 << endl;
}
}