Submission #135051

#TimeUsernameProblemLanguageResultExecution timeMemory
135051baluteshihTriple Jump (JOI19_jumps)C++14
100 / 100
1432 ms103148 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define jizz ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pb push_back
#define ET cout << "\n"
#define ALL(v) v.begin(),v.end()
#define MP make_pair
#define F first
#define S second
#define MEM(i,j) memset(i,j,sizeof i)
#define DB(a,s,e) {for(int i=s;i<e;++i) cout << a[i] << " ";ET;}
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

struct node
{
	ll data,mx,lazy;
}seg[2000005];

const ll INF=1e18;
ll arr[500005],ans[500005],n;
vector<ll> v;
vector<pll> op[500005],qur[500005];

void down(ll rt)
{
	if(seg[rt].lazy==-INF) return;
	seg[rt<<1].lazy=max(seg[rt<<1].lazy,seg[rt].lazy),seg[rt<<1].data=max(seg[rt<<1].data,seg[rt<<1].mx+seg[rt].lazy);
	seg[rt<<1|1].lazy=max(seg[rt<<1|1].lazy,seg[rt].lazy),seg[rt<<1|1].data=max(seg[rt<<1|1].data,seg[rt<<1|1].mx+seg[rt].lazy);
	seg[rt].lazy=-INF;
}

node up(node a,node b,ll lazy)
{
	return node{max({a.data,b.data,max(a.mx,b.mx)+lazy}),max(a.mx,b.mx),lazy};
}

void build(ll l,ll r,ll rt)
{
	if(l==r)
		return seg[rt]=node{-INF,arr[l],-INF},void();
	ll m=l+r>>1;
	build(l,m,rt<<1),build(m+1,r,rt<<1|1);
	seg[rt]=up(seg[rt<<1],seg[rt<<1|1],-INF);
}

void modify(ll L,ll R,ll l,ll r,ll rt,ll v)
{
	if(l!=r) down(rt);
	if(L<=l&&R>=r)
		return seg[rt].lazy=max(seg[rt].lazy,v),seg[rt].data=max(seg[rt].data,seg[rt].mx+v),void();
	ll m=l+r>>1;
	if(L<=m) modify(L,R,l,m,rt<<1,v);
	if(R>m) modify(L,R,m+1,r,rt<<1|1,v);
	seg[rt]=up(seg[rt<<1],seg[rt<<1|1],seg[rt].lazy);
}

node query(ll L,ll R,ll l,ll r,ll rt)
{
	if(l!=r) down(rt);
	if(L<=l&&R>=r)
		return seg[rt];
	ll m=l+r>>1;
	if(R<=m) return query(L,R,l,m,rt<<1);
	if(L>m) return query(L,R,m+1,r,rt<<1|1);
	return up(query(L,R,l,m,rt<<1),query(L,R,m+1,r,rt<<1|1),seg[rt].lazy);
}

int main()
{jizz
	ll q,l,r;
	cin >> n;
	for(int i=1;i<=n;++i)
		cin >> arr[i];
	build(1,n,1);
	for(int i=1;i<=n;++i)
	{
		for(;!v.empty()&&arr[i]>=arr[v.back()];v.pop_back())
			if(2*i-v.back()<=n)
				op[v.back()].pb(MP(2*i-v.back(),arr[i]+arr[v.back()]));
		if(!v.empty()&&2*i-v.back()<=n)
			op[v.back()].pb(MP(2*i-v.back(),arr[i]+arr[v.back()]));
		v.pb(i);
	}
	cin >> q;
	for(int i=0;i<q;++i)
		cin >> l >> r,qur[l].pb(MP(r,i));
	for(int i=n;i>0;--i)
	{
		for(auto j:op[i])
			modify(j.F,n,1,n,1,j.S); 
		for(auto j:qur[i])
			ans[j.S]=query(i,j.F,1,n,1).data;
	}
	for(int i=0;i<q;++i)
		cout << ans[i] << "\n";
}

Compilation message (stderr)

jumps.cpp: In function 'void build(ll, ll, ll)':
jumps.cpp:44:8: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  ll m=l+r>>1;
       ~^~
jumps.cpp: In function 'void modify(ll, ll, ll, ll, ll, ll)':
jumps.cpp:54:8: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  ll m=l+r>>1;
       ~^~
jumps.cpp: In function 'node query(ll, ll, ll, ll, ll)':
jumps.cpp:65:8: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  ll m=l+r>>1;
       ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...