Submission #442987

#TimeUsernameProblemLanguageResultExecution timeMemory
442987zaneyuHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
64 / 100
3083 ms238080 KiB
/*input
5 2
3 5 1 8 2
1 3 6
2 5 3
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
#define REP(i,n) for(ll i=0;i<n;i++)
#define REP1(i,n) for(ll i=1;i<=n;i++)
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define MXTO(x,y) x=max(x,(__typeof__(x))y)
const int maxn=1e6+5;
#define pb push_back
#define ALL(x) x.begin(),x.end()
#define sz(x) (int)x.size()
int arr[maxn];
vector<int> seg[4*maxn];
int cst[4*maxn];
inline void build(int idx,int l,int r){
    if(l==r){
        cst[idx]=0;
        seg[idx].pb(arr[l]);
        return;
    }
    int mid=(l+r)/2;
    build(idx*2,l,mid);
    build(idx*2+1,mid+1,r);
    seg[idx].resize(sz(seg[idx*2])+sz(seg[idx*2+1]));
    merge(ALL(seg[idx*2]),ALL(seg[idx*2+1]),seg[idx].begin());
    auto z=lower_bound(ALL(seg[idx*2+1]),seg[idx*2].back());
    int cur=0;
    if(z!=seg[idx*2+1].begin()){
        z--;
        cur=(*z)+seg[idx*2].back();
    }
    cst[idx]=max({cst[idx*2],cst[idx*2+1],cur});
    //cout<<l<<' '<<r<<' '<<cst[idx]<<'\n';
}
int mx=0;
int ans=0;
inline void query(int idx,int l,int r,int ql,int qr){
    if(r<ql or l>qr) return;
    if(ql<=l and r<=qr){
        auto z=(lower_bound(ALL(seg[idx]),mx));
        MXTO(ans,cst[idx]);
        if(z==seg[idx].begin()){
            MXTO(mx,seg[idx].back());
            return;
        }
        z=prev(z);
        MXTO(ans,(*z)+mx);
        MXTO(mx,seg[idx].back());
        return;
    }
    int mid=(l+r)/2;
    query(idx*2,l,mid,ql,qr);
    query(idx*2+1,mid+1,r,ql,qr);
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0);
    int n,q;
    cin>>n>>q;
    REP(i,n) cin>>arr[i];
    build(1,0,n-1);
    while(q--){
        int l,r,k;
        cin>>l>>r>>k;
        --l;
        --r;
        mx=0,ans=0;
        query(1,0,n-1,l,r);
        //cout<<ans<<'\n';
        cout<<(ans<=k)<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...