Submission #1345543

#TimeUsernameProblemLanguageResultExecution timeMemory
1345543princeHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
3095 ms35584 KiB
#include "bits/stdc++.h"

using namespace std;

#pragma GCC optimize("Ofast")

struct segtree{
    vector<int> tree,ind;

    segtree(int n){
        tree.assign(n*4,0);
        ind.assign(n*4,0);
    }

    void build(int v,int l,int r,vector<int> &a){
        if(l == r){
            tree[v] = a[l-1];
            ind[v] = l;
        }else{
            int m = (l+r) >> 1;
            
            build(v*2,l,m,a);
            build(v*2+1,m+1,r,a);

            tree[v] = max(tree[v*2],tree[v*2+1]);

            if(tree[v] == tree[v*2+1])
                ind[v] = ind[v*2+1];
            else ind[v] = ind[v*2];
        }
    }

    void update(int v,int l,int r,int i,int x){
        if(l == r){
            tree[v] = x;
        }else{
            int m = (l + r) >> 1;

            if(i<=m)
                update(v*2,l,m,i,x);
            else 
                update(v*2+1,m+1,r,i,x);

            tree[v] = max(tree[v*2],tree[v*2+1]);
            
            if(tree[v] == tree[v*2+1])
                ind[v] = ind[v*2+1];
            else ind[v] = ind[v*2];
        }
    }

    pair<int,int> get(int v,int l,int r,int L,int R){
        if(L > R) return make_pair(-1e9,0);

        if(l == L && r == R) return make_pair(tree[v],ind[v]);

        int m = (l + r) >> 1;

        return max(get(v*2,l,m,L,min(m,R)),get(v*2+1,m+1,r,max(m+1,L),R));
    }
};

int main(){
    #ifdef whymagic
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif

    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n,m;
    cin >> n >> m;

    vector<int> a(n);

    for(auto &x : a)cin >> x;

    segtree sg(n);

    while(m--){
        sg.build(1,1,n,a);

        int l,r,w;
        cin >> l >> r >> w;

        int ok = 1;

        auto [x,i] = sg.get(1,1,n,l,r);

        while(x > 0){
            sg.update(1,1,n,i,0);
            auto [y,j] = sg.get(1,1,n,i+1,r);

            ok &= (x + y <= w);

            auto it = sg.get(1,1,n,l,r);

            x = it.first;
            i = it.second;
        }

        cout << ok << '\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...