#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |