Submission #479297

#TimeUsernameProblemLanguageResultExecution timeMemory
479297nafis_shifatHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
1882 ms110588 KiB
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int mxn=1e6+5;
const int inf = 2e9 + 10;
int n, m;
int a[mxn] = {};

struct segtree {
    int tree[4*mxn];
    void update(int node,int b,int e, int p, int v) {
        if(b > p || e < p) return;
        if(b == e) {
            tree[node] = v;
            return;
        }

        int mid = b + e >> 1;
        int left = node << 1;
        int right = left | 1;
        update(left, b, mid, p, v);
        update(right, mid + 1, e, p, v);
        tree[node] = max(tree[left], tree[right]);
    }
    int query(int node,int b,int e,int l,int r) {
        if(e<l || b>r) return 0;
        if(b >= l && e <= r) return tree[node];
        int mid=b+e>>1;
        int left=node<<1;
        int right=left|1;
        return max(query(left, b, mid, l, r), query(right, mid + 1, e, l, r));
    }
} st;

int main() {
    cin >> n >> m;
    vector<pii> b;
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);

        b.emplace_back(a[i], i);
    }

    a[0] = inf;

    stack<int> St;
    St.push(0);
    int nxt[n + 5];
    vector<int> con[n + 5];
    for(int i = 1; i <= n; i++) {
        while(a[St.top()] <= a[i]) St.pop();

        con[St.top()].push_back(i);

        if(St.top() != 0) st.update(1, 1, n, i, a[St.top()] + a[i]);

        St.push(i);
        
    }

    vector< tuple<int,int, int> > query[n + 1];

    for(int i = 1; i <= m; i++) {
        int l, r, k;
        scanf("%d%d%d", &l, &r, &k);

        query[l].emplace_back(r, i, k);
    }

    bool res[m + 1];

    for(int l = 1; l <= n; l++) {
        for(auto [r, i, k] : query[l]) {
            int v = st.query(1, 1, n, l, r);
            res[i] = (v <= k);
        }

        for(int x : con[l]) {
            st.update(1, 1, n, x, 0);
        }

    }
    for(int i = 1; i <= m; i++) {
        printf("%d\n", res[i]);
    }


}

Compilation message (stderr)

sortbooks.cpp: In member function 'void segtree::update(int, int, int, int, int)':
sortbooks.cpp:19:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   19 |         int mid = b + e >> 1;
      |                   ~~^~~
sortbooks.cpp: In member function 'int segtree::query(int, int, int, int, int)':
sortbooks.cpp:29:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   29 |         int mid=b+e>>1;
      |                 ~^~
sortbooks.cpp: In function 'int main()':
sortbooks.cpp:49:9: warning: unused variable 'nxt' [-Wunused-variable]
   49 |     int nxt[n + 5];
      |         ^~~
sortbooks.cpp:40:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   40 |         scanf("%d", &a[i]);
      |         ~~~~~^~~~~~~~~~~~~
sortbooks.cpp:66:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |         scanf("%d%d%d", &l, &r, &k);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...