Submission #1152523

#TimeUsernameProblemLanguageResultExecution timeMemory
1152523Hamed_GhaffariTriple Jump (JOI19_jumps)C++20
100 / 100
1095 ms78636 KiB
#include<bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;

#define mid ((l+r)>>1)
#define lc (id<<1)
#define rc (lc|1)
#define maxs(a,b) (a=max(a,b))
#define pb push_back

const int MXN = 5e5+5;

int n, q, a[MXN], L[MXN], R[MXN], ans[MXN];
vector<pii> Q[MXN];
vector<int> g[MXN];

int seg[MXN<<2], hseg[MXN<<2], lz[MXN<<2], hlz[MXN<<2];
inline void apply(int x, int id) {
    maxs(hseg[id], seg[id]+=x);
    maxs(hlz[id], lz[id]+=x);
}
inline void push(int id) {
    maxs(hseg[lc], seg[lc]+hlz[id]);
    seg[lc] += lz[id];
    maxs(hlz[lc], lz[lc]+hlz[id]);
    lz[lc] += lz[id];
    maxs(hseg[rc], seg[rc]+hlz[id]);
    seg[rc] += lz[id];
    maxs(hlz[rc], lz[rc]+hlz[id]);
    lz[rc] += lz[id];

    hlz[id] = lz[id] = 0;
}
void upd(int s, int e, int x, int l=1, int r=n+1, int id=1) {
    if(s<=l && r<=e) {
        apply(x, id);
        return;
    }
    push(id);
    if(s<mid) upd(s, e, x, l, mid, lc);
    if(e>mid) upd(s, e, x, mid, r, rc);
    seg[id] = max(seg[lc], seg[rc]);
    hseg[id] = max(hseg[lc], hseg[rc]);
}
int get(int s, int e, int l=1, int r=n+1, int id=1) {
    if(s<=l && r<=e) return hseg[id];
    push(id);
    if(e<=mid) return get(s, e, l, mid, lc);
    if(s>=mid) return get(s, e, mid, r, rc);
    return max(get(s, e, l, mid, lc), get(s, e, mid, r, rc));
}


int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n;
    for(int i=1; i<=n; i++) {
        cin >> a[i];
        for(L[i]=i-1; L[i]&&a[L[i]]<a[i]; L[i]=L[L[i]]);
        if(L[i]) g[L[i]].pb(i);
    }
    for(int i=n; i>=1; i--)
        for(R[i]=i+1; R[i]<=n&&a[R[i]]<a[i]; R[i]=R[R[i]]);
    cin >> q;
    for(int i=1,l,r; i<=q; i++) {
        cin >> l >> r;
        Q[l].pb(pii(r, i));
    }
    for(int i=1; i<=n; i++) upd(i, i+1, a[i]);
    for(int i=n; i>=1; i--) {
        for(int j : g[i])
            if(2*j-i<=n)
                upd(2*j-i, n+1, a[i]+a[j]),
                upd(2*j-i, n+1, -a[i]-a[j]);
        if(2*R[i]-i<=n)
            upd(2*R[i]-i, n+1, a[i]+a[R[i]]),
            upd(2*R[i]-i, n+1, -a[i]-a[R[i]]);
        for(auto [r, id] : Q[i])
            ans[id] = get(i, r+1);
    }
    for(int i=1; i<=q; i++) cout << ans[i] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...