Submission #1360183

#TimeUsernameProblemLanguageResultExecution timeMemory
1360183hovuviettruongTriple Jump (JOI19_jumps)C++17
27 / 100
118 ms155372 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
#define pii pair<int,int>
#define el '\n'
#define file(name)  if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define N 5000006
using namespace std;

int st[N << 2], lazy[N << 2];
int A[N];
int ans[N];
int dp[20][N];
const int lg = 20;
vector<pii> vec[N];

int getmx(int l, int r){
    int k = __lg(r - l + 1);
    return max(dp[k][l], dp[k][r - (1 << k) + 1]);
}

void push(int id, int l, int r){
    if (lazy[id] == 0) return;
    int m = (l + r)/2;
    st[id << 1] = max(st[id << 1], lazy[id] + getmx(l, m));
    st[id << 1 | 1] = max(st[id << 1 | 1], lazy[id] + getmx(m + 1, r));
    lazy[id] = 0;
}
void update(int id, int l, int r, int u, int v, int val){
    if (l > v || r < u) return;
    if (u <= l && r <= v){
        st[id] = max(st[id], val + getmx(l, r));
        lazy[id] = max(lazy[id], val);
        return;
    }
    push(id, l, r);
    int m = (l + r)/2;
    update(id << 1, l, m, u, v, val);
    update(id << 1 | 1, m + 1, r, u, v, val);
    st[id] = max(st[id << 1], st[id << 1 | 1]);
}

int get(int id, int l, int r, int u, int v){
    if (l > v || r < u) return 0;
    if (u <= l && r <= v) return st[id];
    push(id, l, r);
    int m = (l + r)/2;
    return max(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v));
}
signed main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, Q;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> A[i], dp[0][i] = A[i];
    for (int j = 1; j <= lg; j++){
        for (int i = 1; i <= n - (1 << j) + 1; i++){
            dp[j][i] = max(dp[j - 1][i], dp[j - 1][i + (1  << (j - 1))]);
        }
    }

    cin >> Q;
    for (int i = 1; i <= Q; i++){
        int l, r;
        cin >> l >> r;
        vec[l].push_back({r, i});
    }
    stack<int> stk;
    for (int i = n; i >= 1; i--){
        while(!stk.empty() && A[i] >= A[stk.top()]){
            update(1, 1, n, 2 * stk.top() - i, n, A[i] + A[stk.top()]);
            stk.pop();
        }
        if (!stk.empty()){
            update(1, 1, n, 2 * stk.top() - i, n, A[i] + A[stk.top()]);
        }
        stk.push(i);
        for (auto [r, id] : vec[i]){
            ans[id] = get(1, 1, n, i, r);
        }
    }
    for (int i = 1; i <= Q; i++){
        cout << ans[i] <<'\n';
    }
    

   






}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...