This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
using ll  = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define IOS      ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define F        first
#define S        second
#define sz(x)    x.size()
#define all(x)   x.begin(), x.end()
#define pb       push_back
const int Inf    = 2e9 + 10;
const int Mod    = 1e9 + 7;
const int LG     = 25;
const int SQ     = 400;
const int Alpha  = 27;
const int maxN   = 2e5 + 10;
ll n, q;
ll a[maxN];
struct SegTree {
	struct Node {
		ll ans;
		ll L1;
		ll L2;
		ll R1;
		ll R2;
		ll lazy;
		Node() {
			ans = L1 = L2 = R1 = R2 = lazy = 0;
		}
	} t[maxN<<2];
	Node merge(Node lc, Node rc, ll L, ll R) {
		Node ret;
		if(L+2 == R) {
			ret.ans = abs(lc.R1 - rc.L1);
			ret.L1 = lc.L1;
			ret.L2 = rc.L1;
			ret.R1 = rc.R1;
			ret.R2 = lc.R1;
			return ret;
		}
		if(L+3 == R) {
			ret.L1 = lc.L1;
			ret.L2 = rc.L1;
			ret.R1 = rc.R1;
			ret.R2 = rc.R2;
			ll x = lc.R1;
			ll y = rc.L1;
			ll z = rc.L2;
			if(x <= y and y <= z) {
				ret.ans = z-x;
			}
			else if(x <= y and y >= z) {
				ret.ans = max(y-x, y-z);
			}
			else if(x >= y and y <= z) {
				ret.ans = max(x-y, z-y);
			}
			else if(x >= y and y >= z) {
				ret.ans = x-z;
			}
			return ret;
		}
		
		ret.L1 = lc.L1;
		ret.L2 = lc.L2;
		ret.R1 = rc.R1;
		ret.R2 = rc.R2;
		ll mid = (L+R)>>1;
		ll x = lc.R2;
		ll y = lc.R1;
		ll z = rc.L1;
		ll w = rc.L2;
		if(x <= y and y <= z and z <= w) {
			ret.ans = lc.ans + rc.ans + (z-y);
		}
		else if(x <= y and y <= z and z >= w) {
			ret.ans = lc.ans + rc.ans;
			if(z-y > z-w) {
				ret.ans += (z-y) - (z-w);
			}
		}
		else if(x <= y and y >= z and z <= w) {
			ret.ans = lc.ans + rc.ans;
			ret.ans += max(0LL, (y-z)-(y-x)-(w-z));
		}
		else if(x <= y and y >= z and z >= w) {
			ret.ans = lc.ans + rc.ans;
			if(y-z > y-x) {
				ret.ans += (y-z) - (y-x);
			}
		}
		else if(x >= y and y <= z and z <= w) {
			ret.ans = lc.ans + rc.ans;
			ret.ans += max(0LL, (z-y) - (x-y) - (z-w));
		}
		else if(x >= y and y <= z and z >= w) {
			ret.ans = lc.ans + rc.ans;
			ret.ans += max(0LL, (z-y) - (x-y));
		}
		else if(x >= y and y >= z and z <= w) {
			ret.ans = lc.ans + rc.ans;
			ret.ans += max(0LL, (y-z) - (x-y) - (w-z));
		}
		else if(x >= y and y >= z and z >= w) {
			ret.ans = lc.ans + rc.ans + y-z;
		}
		return ret;
	}
	void spread(ll id, ll L, ll R) {
		ll mid = (L+R)>>1;
		t[2*id+0].lazy += t[id].lazy;
		t[2*id+0].L1 += t[id].lazy;
		t[2*id+0].R1 += t[id].lazy;
		if(mid-L > 1) {
			t[2*id+0].L2 += t[id].lazy;
			t[2*id+0].R2 += t[id].lazy;
		}
		
		t[2*id+1].lazy += t[id].lazy;
		t[2*id+1].L1 += t[id].lazy;
		t[2*id+1].R1 += t[id].lazy;
		if(R-mid > 1) {
			t[2*id+1].L2 += t[id].lazy;
			t[2*id+1].R2 += t[id].lazy;
		}
		t[id].lazy = 0;
	}
	void initialize(ll id, ll L, ll R) {
		if(L+1 == R) {
			t[id].ans = 0;
			t[id].L1 = a[L];
			t[id].R1 = a[L];
			return;
		}
		ll mid = (L+R)>>1;
		initialize(2*id+0, L, mid);
		initialize(2*id+1, mid, R);
		t[id] = merge(t[2*id+0], t[2*id+1], L, R);
	}
	void update(ll id, ll L, ll R, ll l, ll r, ll x) {
		spread(id, L, R);
		
		if(L == l and R == r) {
			t[id].lazy += x;
			t[id].L1 += x;
			t[id].R1 += x;
			if(R-L > 1) {
				t[id].L2 += x;
				t[id].R2 += x;
			}
			return;
		}
		ll mid = (L+R)>>1;
		if(l < mid)
			update(2*id+0, L, mid, l, min(mid, r), x);
		if(r > mid)
			update(2*id+1, mid, R, max(l, mid), r, x);
		t[id] = merge(t[2*id+0], t[2*id+1], L, R);
	}
	Node Get(ll id, ll L, ll R, ll l, ll r) {
		spread(id, L, R);
		if(L == l and R == r)
			return t[id];
		ll mid = (L+R)>>1;
		Node lc, rc;
		if(l < mid and r <= mid) {
			return Get(2*id+0, L, mid, l, r);
		}
		if(l < mid and r > mid) {
			lc = Get(2*id+0, L, mid, l, mid);
			rc = Get(2*id+1, mid, R, mid, r);
			return merge(lc, rc, l, r);
		}
		if(l >= mid and r > mid) {
			return Get(2*id+1, mid, R, l, r);
		}
		return lc;
	}
};
int main() {
	IOS;
	
	cin >> n >> q;
	for(ll i = 1; i <= n; i++) {
		cin >> a[i];
	}
	SegTree s;
	s.initialize(1, 1, n+1);
	while(q--) {
		ll l, r, v;
		cin >> l >> r >> v;
		s.update(1, 1, n+1, l, r+1, v);
		SegTree::Node g = s.Get(1, 1, n+1, 1, n+1);
		cout << g.ans << "\n";
	}
}
Compilation message (stderr)
Main.cpp: In member function 'SegTree::Node SegTree::merge(SegTree::Node, SegTree::Node, ll, ll)':
Main.cpp:83:6: warning: unused variable 'mid' [-Wunused-variable]
   83 |   ll mid = (L+R)>>1;
      |      ^~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |