Submission #1259554

#TimeUsernameProblemLanguageResultExecution timeMemory
1259554_rain_Triple Jump (JOI19_jumps)C++20
100 / 100
736 ms91724 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

#define FOR(i,a,b) for(int i = (a) , _b = (b); i <= _b; ++i)
#define MASK(x) ((LL)(1)<<(x))
#define BIT(mask , x) (((mask)>>x)&(1))
#define sz(x) (int)(x).size()

template<class X,class Y>	
	bool maximize(X &x , Y y){
		if (x < y) return x = y , true; else return false;
	}
template<class X,class Y>
	bool minimize(X &x , Y y){
		if (x > y) return x = y , true; else return false;
	}
template<class T>
	void compress(vector<T>&data){
		sort(data.begin() , data.end());
		data.resize(unique(data.begin() , data.end()) - data.begin());
	}
template<class X,class Y>
	int Find(vector<X>&data,Y y){
		return upper_bound(data.begin() , data.end() , y) - data.begin();
	}

const int N = (int) 5e5;
	int a[N + 2] , ans[N + 2];
	int n , q;
	vector<pair<int,int>>block[N+2];
	vector<pair<int,int>>add[N+2];

	void insert_block(int l, int r){
		add[l].push_back({2 * r - l , a[l] + a[r]});
		return;
	}

	LL st_val[N*4+2] , st_upd[N*4+2] , st[N*4+2];
	
		void reup(int id){
			maximize(st[id] , st_val[id] + st_upd[id]);
			return;
		}
		
		void build(int id,int l,int r){
			if (l==r) st_val[id] = st[id] = a[l];
			else{
				int m = (l + r) / 2;
				build(id*2,l,m);
				build(id*2+1,m+1,r);
				st_val[id] = max(st_val[id*2] , st_val[id*2+1]);
				reup(id);
			}
			return;
		}
		
		void pushdown(int id){
			LL &t = st_upd[id];
				maximize(st_upd[id*2],t);
				maximize(st_upd[id*2+1],t);
				reup(id*2) , reup(id*2+1);
			return;
		}
		
		void upd(int id , int l, int r , int u , int v ,LL val){
			if (l > v || r < u) return;
			if (u <= l && r <= v) {
				maximize(st_upd[id] , val);
				reup(id);
				return;
			}
			int m = (l + r)/2;
			pushdown(id);
			upd(id*2,l,m,u,v,val);
			upd(id*2+1,m+1,r,u,v,val);
			st[id] = max(st[id*2] , st[id*2+1]);
		}
		LL Get(int id , int l, int r , int u , int v){
			if (l > v || r < u) return 0;
			if (u <= l && r <= v) {
				reup(id);
				return st[id];
			}
			int m = (l+r)/2;
			pushdown(id);
			return max(Get(id*2,l,m,u,v) , Get(id*2+1,m+1,r,u,v));
		}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0) ;
	#define name "main"
		if (fopen(name".inp","r")){
			freopen(name".inp","r",stdin);
			freopen(name".out","w",stdout);
		}
		
		cin >> n;
		for(int i = 1; i <= n; ++i) cin >> a[i];
		cin >> q;
		for(int i = 1; i <= q; ++i){
			int l , r; cin >> l >> r;
			block[l].push_back({r , i});
		}
		vector<int>st;
		for(int i = n; i >= 1; --i){
			while (st.size() && a[st.back()] <= a[i]){
				insert_block(i , st.back());
				st.pop_back();
			}
			if (st.size()) insert_block(i , st.back());
			st.push_back(i);
		}
		build(1,1,n);
		for(int i = n; i >= 1; --i){
			for(auto& x : add[i]) upd(1,1,n,x.first,n,x.second);
			for(auto& x : block[i]) ans[x.second] = Get(1,1,n,i,x.first);
		}
		for(int i = 1; i <= q; ++i) cout << ans[i] << '\n';
}

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:95:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   95 |                         freopen(name".inp","r",stdin);
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:96:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |                         freopen(name".out","w",stdout);
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...