제출 #236852

#제출 시각아이디문제언어결과실행 시간메모리
236852egekabas3단 점프 (JOI19_jumps)C++14
100 / 100
1587 ms60152 KiB
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long   ll;
typedef unsigned long long   ull;
typedef long double ld;
typedef pair<int, int>    pii;
typedef pair<ull, ull>    pull;
typedef pair<ld, ld>  pld;
pii merge(pii a, pii b){
    return mp(max(a.ff, b.ff), max(a.ss, b.ss));
}
int n;
int a[500009];
pii seg[2000009];
int lazy[2000009];
void push(int v){
    lazy[2*v] = max(lazy[2*v], lazy[v]);
    lazy[2*v+1] = max(lazy[2*v+1], lazy[v]);
    seg[2*v].ff = max(seg[2*v].ff, seg[2*v].ss+lazy[2*v]);
    seg[2*v+1].ff = max(seg[2*v+1].ff, seg[2*v+1].ss+lazy[2*v+1]);
    lazy[v] = 0;
}
void build(int v, int tl, int tr){
    if(tl == tr){
        seg[v] = {a[tl], a[tl]};
        return;
    }
    build(2*v, tl, (tl+tr)/2);
    build(2*v+1, (tl+tr)/2+1, tr);
    seg[v] = merge(seg[2*v], seg[2*v+1]);
}
void upd(int v, int tl, int tr, int l, int r, int val){
    if(r < tl || tr < l)
        return;
    if(l <= tl && tr <= r){
        lazy[v] = max(lazy[v], val);
        seg[v].ff = max(seg[v].ff, seg[v].ss+lazy[v]);
    }
    else{
        push(v);
        upd(2*v, tl, (tl+tr)/2, l, r, val);
        upd(2*v+1, (tl+tr)/2+1, tr, l, r, val);
        seg[v] = merge(seg[2*v], seg[2*v+1]);
    }
}
pii get(int v, int tl, int tr, int l, int r){
    if(r < tl || tr < l)
        return {0, 0};
    if(l <= tl && tr <= r)
        return seg[v];
    else{
        push(v);
        return merge(get(2*v, tl, (tl+tr)/2, l, r), get(2*v+1, (tl+tr)/2+1, tr, l, r));
    }
}
int q;
vector<pii> qu[500009];
int ans[500009];
int main() {
    
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    
    cin >> n;
    for(int i = 0; i < n; ++i)
        cin >> a[i];
    build(1, 0, n-1);
    cin >> q;
    for(int i = 0; i < q; ++i){
        int l, r;
        cin >> l >> r;
        qu[l-1].pb({r-1, i});
    }
    deque<pii> inc;
    for(int i = n-1; i >= 0; --i){
        for(auto u : inc){
            upd(1, 0, n-1, 2*u.ss-i, n-1, a[i]+u.ff);
            if(u.ff >= a[i])
                break;
        }
        while(inc.size() > 0){
            if(inc.front().ff <= a[i])
                inc.pop_front();
            else
                break;
        }
        inc.push_front({a[i], i});
        for(auto u : qu[i])
            ans[u.ss] = get(1, 0, n-1, i+2, u.ff).ff;

    }
    for(int i = 0; i < q; ++i)
        cout << ans[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...