Submission #134502

#TimeUsernameProblemLanguageResultExecution timeMemory
134502RezwanArefin01Triple Jump (JOI19_jumps)C++17
100 / 100
1417 ms111600 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> ii; 

const int N = 5e5 + 10;
const ll inf = 1e18;

int n, q, a[N], ans[N];
vector<ii> Q[N]; 
vector<int> B[N]; 

struct Node {
    ll a, f, af; 
    Node(ll a = -inf, ll f = -inf, ll af = -inf): 
        a(a), f(f), af(af) {}
} t[N << 2]; 

Node merge(Node l, Node r) {
    return Node(max(l.a, r.a), max(l.f, r.f), max({l.af, r.af, l.f + r.a}));
}

void update(int node, int l, int r, int i, int x, int f) {
    if(l == r) {
        if(f) t[node].f = max(t[node].f, (ll)x); 
        else t[node].a = max(t[node].a, (ll)x); 
        t[node].af = max(-inf, t[node].f + t[node].a);
    } else {
        int m = l + r >> 1; 
        if(i <= m) update(node << 1, l, m, i, x, f); 
        else update(node << 1 | 1, m + 1, r, i, x, f);
        t[node] = merge(t[node << 1], t[node << 1 | 1]); 
    }
}

Node query(int node, int l, int r, int i, int j) {
    if(r < i || l > j) return Node(); 
    if(i <= l && r <= j) return t[node];
    int m = l + r >> 1; 
    return merge(query(node << 1, l, m, i, j), 
           query(node << 1 | 1, m + 1, r, i, j));
}

int main(int argc, char const *argv[]) {
#ifdef LOCAL
    freopen("in", "r", stdin);
#endif
    scanf("%d", &n);

    stack<int> st;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]); 

        while(st.size() && a[st.top()] <= a[i]) {
            B[st.top()].push_back(i); 
            st.pop();
        }
        if(st.size()) {
            B[st.top()].push_back(i); 
        }
        st.push(i);

        update(1, 1, n, i, a[i], 0);
    }   

    scanf("%d", &q);
    for(int i = 1; i <= q; ++i) {
        int l, r;
        scanf("%d %d", &l, &r); 
        Q[l].emplace_back(r, i);
    }

    for(int i = n; i >= 1; --i) {
        for(int b : B[i]) if(2 * b - i <= n) {
            update(1, 1, n, 2 * b - i, a[i] + a[b], 1);
        }
        for(ii x : Q[i]) {
            ans[x.second] = query(1, 1, n, i, x.first).af; 
        }
    }

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

Compilation message (stderr)

jumps.cpp: In function 'void update(int, int, int, int, int, int)':
jumps.cpp:30:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
         int m = l + r >> 1; 
                 ~~^~~
jumps.cpp: In function 'Node query(int, int, int, int, int)':
jumps.cpp:40:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int m = l + r >> 1; 
             ~~^~~
jumps.cpp: In function 'int main(int, const char**)':
jumps.cpp:84:32: warning: format '%lld' expects argument of type 'long long int', but argument 2 has type 'int' [-Wformat=]
         printf("%lld\n", ans[i]);
                          ~~~~~~^
jumps.cpp:49:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
jumps.cpp:53:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &a[i]); 
         ~~~~~^~~~~~~~~~~~~
jumps.cpp:67:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &q);
     ~~~~~^~~~~~~~~~
jumps.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         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...