#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define loop(i, s, e) for (ll i = s; i < e; ++i)
#define pll pair<ll, ll>
struct Seg {
  vll seg;
  ll sz = 1;
  Seg(ll n) {
    for (; sz < n; sz <<= 1)
      ;
    seg.resize(2 * sz);
  }
  void update(ll i, ll v) {
    i += sz;
    seg[i] = v;
    for (i /= 2; i > 0; i /= 2)
      seg[i] = max(seg[i * 2], seg[i * 2 + 1]);
  }
  ll query(ll l, ll r) {
    ll ans = 0;
    l += sz, r += sz;
    while (l <= r) {
      if (l & 1)
        ans = max(ans, seg[l++]);
      if (!(r & 1))
        ans = max(ans, seg[r--]);
      l /= 2;
      r /= 2;
    }
    return ans;
  }
};
int main() {
  ll n, m;
  cin >> n >> m;
  vll w(n);
  loop(i, 0, n) cin >> w[i];
  Seg seg(1e6 + 1);
  set<pll, greater<pll>> match;
  loop(i, 0, n) {
    match.insert({w[i], i});
    auto it = match.lower_bound({w[i], i});
    ll idx = it->second;
    seg.update(i, idx);
  }
  while (m--) {
    ll l, r, k;
    cin >> l >> r >> k;
    bool ans = 1;
    l--, r--;
    ll maxi = seg.query(l, r);
    if (maxi >= l) {
      ans = 0;
    }
    cout << ans << "\n";
  }
  return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |