Submission #1160742

#TimeUsernameProblemLanguageResultExecution timeMemory
1160742thelegendary08Sjeckanje (COCI21_sjeckanje)C++17
55 / 110
55 ms17476 KiB
#include<bits/stdc++.h>
#define f0r(i,n) for(int i = 0; i<n; i++)
#define pb push_back
#define vi vector<long long int>
#define ll long long int
#define mp make_pair
#define pii pair<ll,ll>
#define FOR(i, k, n) for(int i = k; i<n; i++)
using namespace std;
const int mxn = 2e5 + 5;
ll d[mxn];
vector<vector<ll>>tree(mxn, vector<ll>(4));
vector<ll> merge(vi a, vi b, bool same){
	if(same){
		return {max(a[0], a[1]) + max(b[0], b[2]), max(a[0], a[1]) + max(b[1], b[3]), max(a[2], a[3]) + max(b[0], b[2]), max(a[2], a[3]) + max(b[1], b[3])};
	}
	else{
		return {max(a[0] + b[2], max(a[1] + b[0], a[0] + b[0])), max(a[1] + b[1], max(a[0] + b[3], a[0] + b[1])), max(a[2] + b[2], max(a[3] + b[0], a[2] + b[0])), max(a[3] + b[1], max(a[2] + b[3], a[2] + b[1]))};
	}
}
vector<ll> build(int l, int r, int node = 1){
	if(l == r){
		tree[node] = {0, (ll)-1e17, (ll)-1e17, abs(d[l])};
		return tree[node];
	}
	else{
		int mid = (l + r) / 2;
		tree[node] = merge(build(l, mid, node * 2), build(mid + 1, r, node * 2 + 1),!((d[mid] > 0 &&  d[mid + 1] < 0) || (d[mid] < 0 && d[mid + 1] > 0)));
		return tree[node];
	}
	
}
int n;
void update(int k, int l, int r, int node = 1){
	
	if(l == r){
		// f0r(i,n-1)cout<<d[i]<<' ';
		// cout<<'\n';	
		tree[node] = {0, (ll)-1e17, (ll)-1e17, abs(d[l])};
	}
	else{
		int mid = (l + r) / 2;
		if(k <= mid){
			update(k, l, mid, node * 2);
		}
		else{
			update(k, mid + 1, r, node * 2 + 1);
		}
		tree[node] = merge(tree[node * 2], tree[node * 2 + 1], !((d[mid] > 0 &&  d[mid + 1] < 0) || (d[mid] < 0 && d[mid + 1] > 0)));
	}
}
int main(){
	cin>>n; int q; cin>>q;
	vi v(n);
	f0r(i,n)cin>>v[i];
	f0r(i,n-1){
		d[i] = v[i+1] - v[i];
	}
	// f0r(i,n-1)cout<<d[i]<<' ';
	// cout<<'\n';
	build(0, n-2);
	// cout<<max(tree[1][0], max(tree[1][1], max(tree[1][2], tree[1][3])))<<'\n';
	while(q--){
		int l,r,x;
		cin>>l>>r>>x;
		l--; r--;
		if(l != 0){
			d[l-1] += x;
			update(l-1, 0, n-2);
		}
		if(r != n-1){
			d[r]-=x;
			update(r, 0, n-2);
		}
		// f0r(i,n-1)cout<<d[i]<<' ';
		// cout<<'\n';
		cout<<max(tree[1][0], max(tree[1][1], max(tree[1][2], tree[1][3])))<<'\n';
	}	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...