Submission #296412

#TimeUsernameProblemLanguageResultExecution timeMemory
296412BeanZTriple Jump (JOI19_jumps)C++14
100 / 100
1591 ms114232 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define endl '\n'
const int N = 5e5 + 5;
struct viet{
        ll a, b, v;
};
viet st[N * 4];
ll a[N], ans[N];
vector<pair<ll, ll>> mem[N], qr[N];
void Init(ll k, ll l, ll r){
        if (l == r){
                st[k].a = a[l];
                return;
        }
        ll mid = (l + r) >> 1;
        Init(k << 1, l, mid);
        Init(k << 1 | 1, mid + 1, r);
        st[k].a = max(st[k << 1].a, st[k << 1 | 1].a);
}
void down(ll k){
        st[k << 1].b = max(st[k << 1].b, st[k].b);
        st[k << 1].v = max(st[k << 1].v, st[k << 1].a + st[k << 1].b);
        st[k << 1 | 1].b = max(st[k << 1 | 1].b, st[k].b);
        st[k << 1 | 1].v = max(st[k << 1 | 1].v, st[k << 1 | 1].a + st[k << 1 | 1].b);
}
void upd(ll k, ll l, ll r, ll x, ll y, ll v){
        if (x > r || y < l) return;
        if (l != r) down(k);
        if (x <= l && y >= r){
                st[k].b = max(st[k].b, v);
                st[k].v = max(st[k].v, st[k].b + st[k].a);
                return;
        }
        ll mid = (l + r) >> 1;
        upd(k << 1, l, mid, x, y, v);
        upd(k << 1 | 1, mid + 1, r, x, y, v);
        st[k].v = max(st[k << 1].v, st[k << 1 | 1].v);
}
ll get(ll k, ll l, ll r, ll x, ll y){
        if (x > r || y < l) return 0;
        if (l != r) down(k);
        if (x <= l && y >= r) return st[k].v;
        ll mid = (l + r) >> 1;
        return max(get(k << 1, l, mid, x, y), get(k << 1 | 1, mid + 1, r, x, y));
}
int main(){
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        if (fopen("balance.in", "r")){
                freopen("balance.in", "r", stdin);
                freopen("balance.out", "w", stdout);
        }
        ll n;
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        stack<ll> s;
        for (int i = 1; i <= n; i++){
                while (s.size()){
                        if (a[s.top()] <= a[i]){
                                ll k = 2 * i - s.top();
                                if (k <= n) mem[s.top()].push_back({k, a[i] + a[s.top()]});
                        } else break;
                        s.pop();
                }
                if (s.size()){
                        ll k = 2 * i - s.top();
                        if (k <= n) mem[s.top()].push_back({k, a[i] + a[s.top()]});
                }
                s.push(i);
        }
        ll q;
        cin >> q;
        for (int i = 1; i <= q; i++){
                ll l, r;
                cin >> l >> r;
                qr[l].push_back({r, i});
        }
        Init(1, 1, n);
        for (int i = n; i >= 1; i--){
                for (auto j : mem[i]){
                        upd(1, 1, n, j.first, n, j.second);
                }
                for (auto j : qr[i]){
                        ans[j.second] = get(1, 1, n, i, j.first);
                }
        }
        for (int i = 1; i <= q; i++) cout << ans[i] << endl;
}
/*
*/

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:54:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   54 |                 freopen("balance.in", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:55:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   55 |                 freopen("balance.out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...