#include<bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define int long long
const int N = 1e6 + 9;
const int LG = 22;
int a[N],Mx[N<<2], n;
void update(int x,int p,int cur = 1,int st = 1,int en = n){
    if(st==en){
        Mx[cur]=x;
        return;
    }
    int M = (st+en)/2;
    if(st<=p and p<=M)
        update(x, p, cur*2 ,st, M);
    else
        update(x, p, cur*2 + 1 ,M + 1, en);
    Mx[cur]=max(Mx[cur*2],Mx[cur*2+1]);
}
int get(int l,int r,int cur = 1,int st = 1,int en = n){
    if(en<l or st>r)return 0;
    if(l <= st and en <=r)return Mx[cur];
    int M = (st+en) / 2;
    return max(get(l,r,cur * 2,st,M),get(l,r,cur*2+1,M+1,en));
}
void solve(){
    int m;cin>>n>>m;
    vector<vector<int>> T[n+3];
    for(int i=1;i<=n;i++)cin>>a[i];
    vector<int> ans(m + 1);
    for(int i=1;i<=m;i++){
        int l,r,k;
        cin>>l>>r>>k;
        T[r].push_back({l,i,k});
    }
    vector<int> Vec;
    for(int i=1;i<=n;i++){
        while(Vec.size() and a[Vec.back()]<=a[i])
            Vec.pop_back();
        if(Vec.size())
            update(a[Vec.back()]+a[i],Vec.back());
        Vec.push_back(i);
        for(vector<int> j:T[i]){
            int R = get(j[0], i);
            if(R <= j[2])ans[j[1]] = 1;
            else ans[j[1]] = 0;
        }
    }
    for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';
}  
signed main(){
    int t=1;
    // cin>>t
    while(t--){
        solve();
    }
}
| # | 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... |