Submission #1313657

#TimeUsernameProblemLanguageResultExecution timeMemory
1313657yessimkhanTriple Jump (JOI19_jumps)C++20
5 / 100
4091 ms18428 KiB
#include <bits/stdc++.h>

#define int long long
#define ent '\n'
#define pb push_back
#define all(x) x.begin(),x.end()
#define PRaim_bek_abi ios_base::sync_with_stdio(0);cin.tie(0);

using namespace std;

const int N = 5e5+5 , maxn = 3e5 + 5;
const int MOD = 1e9+7;

struct tree{
    int cnt , l , r;
};

int n , q , a[N] , mx[4 * N];
tree t[4 * N];

tree merge(tree a , tree b){

    tree res;

    if (a.cnt != b.cnt){
        if (a.cnt < b.cnt) res = b;
        else res = a;
    }

    else {
        res.cnt = a.cnt;
        res.l = min(a.l , b.l);
        res.r = max(a.r , b.r);
    }

    return res; 
}

void build(int v , int tl , int tr){
    if (tl == tr){
        t[v] = {a[tl] , tl , tl};
        mx[v] = a[tl];
        return;
    }

    int tm = (tl + tr) / 2;

    build(v * 2 , tl , tm) , build(v * 2 + 1 , tm + 1,  tr);

    t[v] = merge(t[v * 2] , t[v * 2 + 1]);

    mx[v] = max(mx[v * 2] , mx[v * 2 + 1]);
}

tree get(int v , int tl , int tr , int l , int r){
    if (tr < l or r < tl) return {0 , 0 , 0};
    if (l <= tl and tr <= r) return t[v];
    int tm = (tl + tr) / 2;
    return merge(get(v * 2 , tl , tm , l , r) , get(v * 2 + 1 , tm + 1, tr , l , r));
}

int gmx(int v , int tl , int tr , int l , int r){
    if (tr < l or r < tl) return 0;
    if (l <= tl and tr <= r) return mx[v];
    int tm = (tl + tr) / 2;
    return max(gmx(v * 2 , tl , tm , l , r) , gmx(v * 2 + 1 , tm + 1, tr , l , r));
}

void update(int v , int tl , int tr , int i , int x){
    if (tl == tr){
        t[v].cnt = x;
        return;
    }
    int tm = (tl + tr) / 2;
    if (i <= tm) update(v * 2 , tl , tm , i , x);
    else update(v * 2 + 1 , tm + 1 , tr , i , x);

    t[v] = merge(t[v * 2] , t[v * 2 + 1]);
}

void arkanefury228(){

    cin >> n;

    for (int i = 1; i <= n; i++){

        cin >> a[i];

    }

    cin >> q;

    build(1 , 1 , n);

    while(q--){

        int l , r , ans = 0;
        bool t = 0;
        vector<int> p;

        cin >> l >> r;

        while(p.size() != r - l + 1 and p.size() < 100){
            
            t = 1 - t;

            auto gt = get(1 , 1 , n , l , r);

            int pos = 0;

            if (t == 0) pos = gt.l;
            else pos = gt.r;

            p.pb(pos);

            update(1 , 1 , n , pos , 0);
        }

        sort(all(p));

        for (int i = 0; i < p.size(); i++){
            for (int j = i + 1; j < p.size(); j++){
                if (p[j] - p[i] + 1 <= 2) continue;
                ans = max(ans , a[p[j]] + a[p[i]] + gmx(1 , 1 , n , p[i] + 1 , (p[i] + p[j]) / 2));
            }
        }

        for (int i = 0; i < p.size(); i++){
            for (int j = i + 1; j < p.size(); j++){
                if (p[j] + (p[j] - p[i]) > r) continue;
                ans = max(ans , a[p[j]] + a[p[i]] + gmx(1 , 1 , n , p[j] + (p[j] - p[i]) , r));
            }
        }

        for (int i = 0; i < p.size(); i++){
            if (p[i] == l) continue;
            for (int j = i + 1; j < p.size(); j++){
                ans = max(ans , a[p[i]] + a[p[j]] + gmx(1 , 1 , n , max(l , p[i] - (p[j] - p[i])) , p[i] - 1));
            }
        }

        for (auto i : p){
            update(1 , 1 , n , i , a[i]);
        }

        cout << ans << ent;
    }
}


signed main(){

    PRaim_bek_abi

    int t=1;
    //cin>>t;
    for (int respagold = 1; respagold <= t; respagold++) arkanefury228();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...