#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ed "\n"
#define fi first
#define se second
#define irs insert
#define pb push_back
#define pi pair<int,int>
#define MASK(i) (1LL << (i))
#define BIT(x, i) ((x>>i)&1)
#define ON(x, i) ((x) MASK(i))
#define OFF(x, i) ((x) & ~MASK(i))
#define ALL(v) v.begin() , v.end()
#define pii pair<int,pair<int,int>>
#define fl(i,a,b) for(int i=a;i>=b;--i)
#define fis(i,a,b) for(int i=a;i<=b;++i)
const int mod=1e9+7;
const int Mdem=998244353;
const int LOG=19;
const int base=31;
const int maxn=5e5+5;
const int bl = 320;
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define gay(a) freopen(a".inp","r",stdin),freopen(a".out","w",stdout)
template <class T>
bool minimize(T &a, const T &b) {
if(a > b) {a = b; return 1;}
return 0;
}
template <class T>
bool maximize(T &a, const T &b) {
if(a < b) {a = b; return 1;}
return 0;
}
template <class T>
void compress(vector <T> &v) {
sort(ALL(v));
v.erase(unique(ALL(v)), (v).end());
}
void add(int &a, int b) { a += b; if (a >= mod) a -= mod; }
void sub(int &a, int b) { a -= b; if (a < 0) a += mod; }
int n, q;
int a[maxn];
ll mx[4 * maxn], t[4 * maxn], lz[4 * maxn];
vector<int> g[maxn];
stack<int> stk;
vector<int> Q[maxn];
pi p[maxn];
ll ans[maxn];
void Push(int i){
while(stk.size() && a[i] > a[stk.top()]){
g[i].pb(stk.top());
stk.pop();
}
if(stk.size()) g[i].pb(stk.top());
stk.push(i);
}
void combine(int id){
t[id] = max(t[id * 2], t[id * 2 + 1]);
mx[id] = max(mx[id * 2], mx[id * 2 + 1]);
}
void build(int id, int l, int r){
if(l > r) return;
if(l == r){
t[id] = mx[id] = a[l];
return;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
combine(id);
}
void down(int id){
if(lz[id]){
t[id * 2] = max(t[id * 2], mx[id * 2] + lz[id]);
t[id * 2 + 1] = max(t[id * 2 + 1], mx[id * 2 + 1] + lz[id]);
lz[id * 2] = max(lz[id * 2], lz[id]);
lz[id * 2 + 1] = max(lz[id * 2 + 1], lz[id]);
lz[id] = 0;
}
}
void update(int id, int l, int r, int u, int v, ll val){
if(l > v || r < u) return;
if(l >= u && r <= v){
t[id] = max(t[id], mx[id] + val);
lz[id] = max(lz[id], val);
return;
}
down(id);
int mid = (l + r) >> 1;
update(id * 2, l, mid, u, v, val);
update(id * 2 + 1, mid + 1, r, u, v, val);
combine(id);
}
ll get(int id, int l, int r, int u, int v){
if(l > v || r < u) return 0;
if(l >= u && r <= v){
return t[id];
}
down(id);
int mid = (l + r) >> 1;
return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
}
signed main(){
fast;
cin >> n;
fis(i, 1, n) cin >> a[i];
build(1, 1, n);
fl(i, n, 1) Push(i);
cin >> q;
fis(i, 1, q){
int l, r; cin >> l >> r;
p[i] = {l, r};
Q[l].pb(i);
}
fl(x, n, 1){
for(int y : g[x]) update(1, 1, n, 2 * y - x, n, a[x] + a[y]);
for(int id : Q[x]) ans[id] = get(1, 1, n, p[id].fi, p[id].se);
}
fis(i, 1, q) cout << ans[i] << ed;
return 0;
}
| # | 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... |