Submission #1261080

#TimeUsernameProblemLanguageResultExecution timeMemory
1261080QuocSenseiTriple Jump (JOI19_jumps)C++20
100 / 100
728 ms94120 KiB
#include <bits/stdc++.h>

#define ll long long
#define el cout << '\n'
#define ii pair<ll, ll>
#define fi first
#define se second

using namespace std;

const int maxn = 5e5;

int n, q;
vector<int> g[maxn + 10];
vector<ii> query[maxn + 10];
vector<ll> stk;
ll a[maxn + 10], ans[maxn + 10], st[4 * maxn + 10], tree[4 * maxn + 10], lazy[4 * maxn + 10];

void build(int id, int l, int r)
{
    if (l == r)
        return tree[id] = a[l], void();
    int m = l + r >> 1;
    build(id << 1, l, m);
    build(id << 1 | 1, m + 1, r);
    tree[id] = max(tree[id << 1], tree[id << 1 | 1]);
}
void push(int id)
{
    for (int nxt_id = 2 * id; nxt_id <= 2 * id + 1; nxt_id++)
    {
        st[nxt_id] = max(st[nxt_id], tree[nxt_id] + lazy[id]);
        lazy[nxt_id] = max(lazy[nxt_id], lazy[id]);
    }
}
void update(int id, int l, int r, int u, int v, ll val)
{
    if (r < u || l > v)
        return ;
    if (u <= l && r <= v)
    {
        st[id] = max(st[id], val + tree[id]);
        lazy[id] = max(lazy[id], val);
        return ;
    }
    int m = l + r >> 1;
    push(id);
    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]);
}
ll get(int id, int l, int r, int u, int v)
{
    if (r < u || l > v)
        return 0;
    if (u <= l && r <= v)
        return st[id];
    int m = l + r >> 1;
    push(id);
    return max(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v));
}
void precompute()
{
    build(1, 1, n);
    for (int i = n; i >= 1; i--)
    {
        while (stk.size() && a[i] > a[stk.back()])
        {
            g[i].push_back(stk.back());
            stk.pop_back();
        }
        if (stk.size())
            g[i].push_back(stk.back());
        stk.push_back(i);
    }
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if (fopen("CHONQUA.INP", "r"))
    {
        freopen("CHONQUA.INP", "r", stdin);
        freopen("CHONQUA.OUT", "w", stdout);
    }

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        int l, r;
        cin >> l >> r;
        query[l].push_back({r, i});
    }
    precompute();
    for (int x = n; x >= 1; x--)
    {
        for (int y : g[x])
            update(1, 1, n, 2 * y - x, n, a[x] + a[y]);
        for (ii pr : query[x])
            ans[pr.se] = get(1, 1, n, x, pr.fi);
    }
    for (int i = 1; i <= q; i++)
        cout << ans[i], el;
}

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:83:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |         freopen("CHONQUA.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:84:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |         freopen("CHONQUA.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...