Submission #515657

#TimeUsernameProblemLanguageResultExecution timeMemory
51565779brueTriple Jump (JOI19_jumps)C++14
100 / 100
836 ms80104 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct Query {
    int l, r, idx;
    Query(){}
    Query(int l, int r, int idx): l(l), r(r), idx(idx){}
};

struct segTree{
    struct Node{
        int l, r, v;
        Node(){}
        Node(int l, int r, int v): l(l), r(r), v(v){}

        Node operator+(const Node &nxt)const{
            return Node(max(l, nxt.l), max(r, nxt.r), max({v, nxt.v, l+nxt.r}));
        }
    } tree[2000002];

    void init(int i, int l, int r, int *arr){
        if(l==r){
            tree[i] = Node(-1e9, arr[l], -1e9);
            return;
        }
        int m = (l+r)>>1;
        init(i*2, l, m, arr);
        init(i*2+1, m+1, r, arr);
        tree[i] = tree[i*2] + tree[i*2+1];
    }

    Node query(int i, int l, int r, int s, int e){
        if(r<s || e<l) return Node(-1e9, -1e9, -1e9);
        if(s<=l && r<=e) return tree[i];
        int m = (l+r)>>1;
        return query(i*2, l, m, s, e) + query(i*2+1, m+1, r, s, e);
    }

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

int n, q;
int arr[500002];
vector<int> interval[500002];
vector<Query> query[500002];
int ans[500002];

void makeInterval(){
    vector<pair<int, int> > vec;
    for(int i=1; i<=n; i++){
        while(!vec.empty() && vec.back().second <= arr[i]){
            interval[vec.back().first].push_back(i);
            vec.pop_back();
        }
        if(!vec.empty()) interval[vec.back().first].push_back(i);
        vec.push_back(make_pair(i, arr[i]));
    }
}

int main(){
    scanf("%d", &n);
    for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
    makeInterval();
    scanf("%d", &q);
    for(int i=1; i<=q; i++){
        int l, r;
        scanf("%d %d", &l, &r);
        query[l].push_back(Query(l, r, i));
    }

    tree.init(1, 1, n, arr);
    for(int i=n-2; i>=1; i--){
        for(int j: interval[i]){
            if(2*j-i>n) continue;
            tree.update(1, 1, n, 2*j-i, arr[i]+arr[j]);
        }
        for(Query p: query[i]){
            ans[p.idx] = tree.query(1, 1, n, i, p.r).v;
        }
    }

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

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:74:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
jumps.cpp:75:34: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |     for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
      |                             ~~~~~^~~~~~~~~~~~~~~
jumps.cpp:77:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
jumps.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |         scanf("%d %d", &l, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...