Submission #1346541

#TimeUsernameProblemLanguageResultExecution timeMemory
1346541jahongirSjeckanje (COCI21_sjeckanje)C++20
110 / 110
299 ms53472 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll inf = 1e18;

int nodemtp[3] = {0,-1,1};

struct Node{
	ll arr[3][3];
	ll mn, mx, lz;

	Node(){
		for(int i = 0; i < 3; i++)
			fill(arr[i],arr[i]+3,-inf);
		lz = 0;
	}

	void leaf(int x){
		mn = x, mx = x;

		arr[0][0] = 0;
		arr[1][0] = -x;
		arr[2][0] = x;
		arr[0][1] = -x;
		arr[0][2] = x;
	}

	void apply(ll x){
		mn += x, mx += x, lz += x;

		for(int i = 0; i < 3; i++)
			for(int j = 0; j < 3; j++){
				arr[i][j] += x*(nodemtp[i]+nodemtp[j]);
				if(arr[i][j] < -inf) arr[i][j] = -inf;
			}
	}
};

Node operator+(const Node &a, const Node &b){
	Node res;
	res.mn = min(a.mn,b.mn);
	res.mx = max(a.mx,b.mx);
	
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			res.arr[i][j] = max(res.arr[i][j],a.arr[i][0]+b.arr[0][j]);
			res.arr[i][j] = max(res.arr[i][j],a.arr[i][1]+b.arr[2][j]);
			res.arr[i][j] = max(res.arr[i][j],a.arr[i][2]+b.arr[1][j]);
			res.arr[i][j] = max(res.arr[i][j],a.arr[i][j]);
			res.arr[i][j] = max(res.arr[i][j],b.arr[i][j]);
		}
	}
	
	return res;
}


const int mxn = 2e5;
int arr[mxn+1];

Node st[1<<19];

void push(int i){
	if(st[i].lz){
		st[i<<1].apply(st[i].lz);
		st[i<<1|1].apply(st[i].lz);
		st[i].lz = 0;
	}
}

void build(int i, int l, int r){
	if(l==r){st[i].leaf(arr[l]); return;}
	int m = (l+r)>>1;
	build(i<<1,l,m);
	build(i<<1|1,m+1,r);
	st[i] = st[i<<1] + st[i<<1|1];
}

void rangeAdd(int i, int l, int r, int s, int e, int v){
	if(r < s || l > e) return;
	if(s <= l && r <= e){st[i].apply(v); return;}
	int m = (l+r)>>1; push(i);
	rangeAdd(i<<1,l,m,s,e,v);
	rangeAdd(i<<1|1,m+1,r,s,e,v);
	st[i] = st[i<<1] + st[i<<1|1];
}



void solve(){
	int n,q; cin >> n >> q;
	for(int i = 1; i <= n; i++)
		cin >> arr[i];
	build(1,1,n);

	for(int t = 0; t < q; t++){
		int l,r,x; cin >> l >> r >> x;
		rangeAdd(1,1,n,l,r,x);
		cout << st[1].arr[0][0] << '\n';
	}

}


signed main(){
	cin.tie(0)->sync_with_stdio(false);
	int t = 1;
	while(t--){solve();}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...