Submission #932946

#TimeUsernameProblemLanguageResultExecution timeMemory
932946amirhoseinfar1385Triple Jump (JOI19_jumps)C++17
100 / 100
1089 ms89168 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=500000+10;
int n,all[maxn],q,res[maxn],kaf=(1<<19);
vector<pair<int,int>>allq[maxn],updy[maxn];

struct segment{
	struct node{
		int mx,lazy,res;
		node(){
			mx=lazy=res=0;
		}
	};
	node seg[(1<<20)];
	void calc(int i){
		if(i>=kaf){
			seg[i].res=max(seg[i].res,seg[i].mx+seg[i].lazy);
			seg[i].lazy=0;
			return ;
		}
		seg[i].res=max(seg[i].res,max(seg[(i<<1)].res,seg[(i<<1)^1].res));
		seg[i].mx=max(seg[(i<<1)].mx,seg[(i<<1)^1].mx);
	}

	void shift(int i){
		if(i>=kaf){
			return calc(i);
		}
		seg[(i<<1)].lazy=max(seg[i].lazy,seg[(i<<1)].lazy);
		seg[(i<<1)^1].lazy=max(seg[i].lazy,seg[(i<<1)^1].lazy);
		seg[i].lazy=0;
		seg[(i<<1)].res=max(seg[(i<<1)].res,seg[(i<<1)].lazy+seg[(i<<1)].mx);
		seg[(i<<1)^1].res=max(seg[(i<<1)^1].res,seg[(i<<1)^1].lazy+seg[(i<<1)^1].mx);
	}
	void ins(int i,int l,int r,int tl,int tr,int w){
		if(l>r||l>tr||r<tl||tl>tr){
			return ;
		}
		if(l>=tl&&r<=tr){
		//	cout<<"ins: "<<l<<" "<<r<<" "<<w<<endl;
			calc(i);
			seg[i].mx=max(w,seg[i].mx);
			seg[i].lazy=0;
			seg[i].res=max(seg[i].res,w);
			return ;
		}
		shift(i);
		int m=(l+r)>>1;
		ins((i<<1),l,m,tl,tr,w);
		ins((i<<1)^1,m+1,r,tl,tr,w);
		calc(i);
	}
	void upd(int i,int l,int r,int tl,int tr,int w){
		if(l>r||l>tr||r<tl||tl>tr){
			return ;
		}
		if(l>=tl&&r<=tr){
		//	cout<<"upd: "<<l<<" "<<r<<" "<<w<<endl;
			seg[i].lazy=max(seg[i].lazy,w);
			seg[i].res=max(seg[i].res,seg[i].mx+seg[i].lazy);
			return ;
		}
		shift(i);
		int m=(l+r)>>1;
		upd((i<<1),l,m,tl,tr,w);
		upd((i<<1)^1,m+1,r,tl,tr,w);
		calc(i);
	}
	int pors(int i,int l,int r,int tl,int tr){
		if(l>r||l>tr||r<tl||tl>tr){
			return 0;
		}
		if(l>=tl&&r<=tr){
			return seg[i].res;
		}
		shift(i);
		calc(i);
		int m=(l+r)>>1;
		return max(pors((i<<1),l,m,tl,tr),pors((i<<1)^1,m+1,r,tl,tr));
	}
}seg;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>all[i];
	}
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r;
		cin>>l>>r;
		allq[r].push_back(make_pair(l,i));
	}
	vector<int>v;
	for(int i=1;i<=n;i++){
		for(auto x:updy[i]){
			seg.ins(1,0,kaf-1,x.first,x.first,x.second);
		}
		seg.upd(1,0,kaf-1,0,i,all[i]);
		for(auto x:allq[i]){
			res[x.second]=seg.pors(1,0,kaf-1,x.first,i);
		}
		while((int)v.size()>0&&all[v.back()]<=all[i]){
			updy[min(n+1,i+(i-v.back()))].push_back(make_pair(v.back(),all[i]+all[v.back()]));
			v.pop_back();
		}
		if((int)v.size()>0){
			updy[min(n+1,i+(i-v.back()))].push_back(make_pair(v.back(),all[i]+all[v.back()]));
		}
		v.push_back(i);
	}
	for(int i=1;i<=q;i++){
		cout<<res[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...