Submission #1118825

#TimeUsernameProblemLanguageResultExecution timeMemory
1118825Dan4LifeTriple Jump (JOI19_jumps)C++17
100 / 100
1217 ms136524 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define int long long
#define sz(a) (int)a.size()
using ar2 = array<int,2>;
const int N = (int)1e6+10;
const int INF = (int)1e18;
int n, q, a[N], ans[N];
vector<ar2> v[N], Q[N];
stack<int> S;

struct Data{
	int mxSm=-INF, mxA=-INF, ans=-INF;
} seg[2*N];

Data comb(Data a, Data b){
	Data c;
	c.mxSm = max(a.mxSm, b.mxSm);
	c.mxA = max(a.mxA, b.mxA);
	c.ans = max({a.ans,b.ans,a.mxSm+b.mxA});
	return c;
}

void upd(int x, int v, int p=0, int l=1, int r=n){
	if(l==r){ 
		seg[p].mxSm = max(seg[p].mxSm, v);
		seg[p].mxA = max(seg[p].mxA,a[x]); 
		seg[p].ans = seg[p].mxSm+seg[p].mxA;
		return;
	}
	int mid = (l+r)/2; int rp = p+2*(mid-l+1);
	if(x<=mid) upd(x,v,p+1,l,mid);
	else upd(x,v,rp,mid+1,r);
	seg[p] = comb(seg[p+1],seg[rp]);
}

Data query(int i, int j, int p=0, int l=1, int r=n){
	if(i>r or j<l or i>j) return {-INF,-INF,-INF};
	if(i<=l and r<=j) return seg[p];
	int mid = (l+r)/2; int rp = p+2*(mid-l+1);
	return comb(query(i,j,p+1,l,mid),query(i,j,rp,mid+1,r));
}

int32_t main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = n,j; i >= 1; i--){
		while(sz(S) and a[S.top()]<a[i])
			j = S.top(), v[i].pb({j,a[i]+a[j]}),S.pop();
		if(sz(S)) j = S.top(), v[i].pb({j,a[i]+a[j]});
		S.push(i);
	}
	cin >> q;
	for(int l,r,i=1; i <= q; i++)
		cin >> l >> r, Q[l].pb({r,i});
	for(int i = n; i >= 1; i--){
		for(auto [j,sum] : v[i]) if(2*j-i<=n) upd(2*j-i,sum);
		for(auto [j,ind] : Q[i]) ans[ind] = query(i,j).ans;
	}
	for(int i = 1; i <= q; i++) cout << ans[i] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...