Submission #1240233

#TimeUsernameProblemLanguageResultExecution timeMemory
1240233ssitaramSjeckanje (COCI21_sjeckanje)C++20
110 / 110
446 ms83376 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

struct segtree {
	int n, sz;
	vector<vector<vector<ll>>> sm;
	vector<ll> D;

	segtree(int sz) : sz(sz) {
		n = 1;
		while (n < sz) n *= 2;
		sm.resize(2 * n - 1, vector<vector<ll>>(2, vector<ll>(2)));
		D.resize(n);
	}

	void upd(int node, int l, int r, int i, int x) {
		if (r == l + 1) {
			D[i] += x;
			sm[node][0][0] = abs(D[i]);
			return;
		}
		int m = (l + r) / 2;
		if (i < m) {
			upd(node * 2 + 1, l, m, i, x);
		} else {
			upd(node * 2 + 2, m, r, i, x);
		}
		bool v = ((D[m] > 0 && D[m - 1] < 0) || (D[m] < 0 && D[m - 1] > 0));
		for (int j = 0; j < 2; ++j) {
			for (int k = 0; k < 2; ++k) {
				if (v) {
					sm[node][j][k] = max(sm[node * 2 + 1][j][0] + sm[node * 2 + 2][1][k], sm[node * 2 + 1][j][1] + sm[node * 2 + 2][0][k]);
				} else {
					sm[node][j][k] = sm[node * 2 + 1][j][0] + sm[node * 2 + 2][0][k];
				}
			}
		}
	}

	void upd(int i, int x) {
		if (i < 0 || i >= sz) return;
		upd(0, 0, n, i, x);
	}
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, q; cin >> n >> q;
	int p = -1;
	segtree st(n - 1);
	for (int i = 0; i < n; ++i) {
		int v; cin >> v;
		if (i > 0) {
			st.upd(i - 1, v - p);
		}
		p = v;
	}
	while (q--) {
		int l, r, x; cin >> l >> r >> x;
		--l; --r;
		st.upd(l - 1, x);
		st.upd(r, -x);
		cout << st.sm[0][0][0] << '\n';
	}
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...