Submission #191500

#TimeUsernameProblemLanguageResultExecution timeMemory
191500oolimryTriple Jump (JOI19_jumps)C++14
100 / 100
1030 ms107272 KiB
#include <bits/stdc++.h>

using namespace std;
typedef pair<long long,long long> ii;
const long long inf = 40000000003LL;

struct node{
	long long c;
	long long ab;
	long long abc;
};

const long long N = 1 << 19; ///change to 1 << 19 upon submitting
static node tree[2*N+5];
static long long arr[N+5];

node relax(node x, node y){
	node z;
	z.c = max(x.c, y.c);
	z.ab = max(x.ab, y.ab);
	z.abc = max(x.ab + y.c, max(x.abc,y.abc));
	return z;
}

void init(){
	for(long long i = N;i < 2*N;i++){
		tree[i] = {arr[i-N],-inf,-inf};
	}
	for(long long i = N-1;i > 0;i--){
		tree[i] = relax(tree[i<<1],tree[i<<1|1]);
	}
}

void update(long long i, long long v){
	i += N;
	tree[i].ab = max(tree[i].ab,v);
	tree[i].abc = max(tree[i].abc,tree[i].ab+tree[i].c);
	while(i > 1){
		i >>= 1;
		tree[i] = relax(tree[i<<1],tree[i<<1|1]);
	}
}

long long query(long long l, long long r){
	node L = {-inf,-inf,-inf};
	node R = {-inf,-inf,-inf};
	for(l += N, r += N;l < r;l >>= 1, r >>= 1){
		if(l&1){
			L = relax(L,tree[l]); 
			l++;
		}
		if(r&1){
			r--;
			R = relax(tree[r],R);
		}
	}
	return relax(L,R).abc;
}

int main(){
	//freopen("i.txt","r",stdin);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	long long n;
	cin >> n; 
	for(long long i = 0;i < n;i++) cin >> arr[i];
	
	vector<long long> critical[n];
	vector<ii> queries[n];
	stack<long long> s;
	for(long long b = 0;b < n;b++){
		while(!s.empty() && arr[b] >= arr[s.top()]){
			long long a = s.top();
			long long c = 2 * b - a;
			if(c < n) critical[a].push_back(c);
			s.pop();
		}
		if(!s.empty()){
			long long a = s.top();
			long long c = 2 * b - a;
			if(c < n) critical[a].push_back(c);
		}
		s.push(b);
	}
	
	long long q; cin >> q;
	long long answer[q];
	for(long long i = 0;i < q;i++){
		long long l, r; cin >> l >> r;
		queries[l-1].push_back(ii(r-1,i));
	}
	
	init();
	
	for(long long l = n-1;l >= 0;l--){
		long long a = l;
		for(long long ab : critical[a]){
			long long b = (a + ab) / 2;
			update(ab, arr[a] + arr[b]);
		}
		for(ii Q : queries[l]){
			long long r = Q.first;
			answer[Q.second] = query(l, r+1);
		}
	}
	
	for(long long i = 0;i < q;i++) cout << answer[i] << "\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...