Submission #1044841

#TimeUsernameProblemLanguageResultExecution timeMemory
1044841GasmaskChanSjeckanje (COCI21_sjeckanje)C++17
110 / 110
255 ms26580 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAX = 2e5 + 5; int d[MAX]; struct SMT { struct Node { int f[2][2]; Node() { memset(f, 0, sizeof f); } }; int n; vector<Node> ST; SMT(int _n) { n = _n; int sz = __lg(n) + 2; ST.resize(1 << sz); } void update(int id, int l, int r, const int &pos) { if (pos < l || r < pos) return; if (l == r) { ST[id].f[1][1] = abs(d[l]); return; } int mid = (l + r) >> 1; update(id << 1, l, mid, pos); update(id << 1 | 1, mid + 1, r, pos); if ((d[mid] <= 0 && d[mid + 1] <= 0) || (d[mid] >= 0 && d[mid + 1] >= 0)) { ST[id].f[0][0] = max(ST[id << 1].f[0][1], ST[id << 1].f[0][0]) + max(ST[id << 1 | 1].f[0][0], ST[id << 1 | 1].f[1][0]); ST[id].f[0][1] = max(ST[id << 1].f[0][0], ST[id << 1].f[0][1]) + max(ST[id << 1 | 1].f[0][1], ST[id << 1 | 1].f[1][1]); ST[id].f[1][0] = max(ST[id << 1].f[1][0], ST[id << 1].f[1][1]) + max(ST[id << 1 | 1].f[1][0], ST[id << 1 | 1].f[0][0]); ST[id].f[1][1] = max(ST[id << 1].f[1][0], ST[id << 1].f[1][1]) + max(ST[id << 1 | 1].f[1][1], ST[id << 1 | 1].f[0][1]); } else { ST[id].f[0][0] = max(ST[id << 1].f[0][1] + ST[id << 1 | 1].f[0][0], ST[id << 1].f[0][0] + ST[id << 1 | 1].f[1][0]); ST[id].f[0][1] = max(ST[id << 1].f[0][0] + ST[id << 1 | 1].f[1][1], ST[id << 1].f[0][1] + ST[id << 1 | 1].f[0][1]); ST[id].f[1][0] = max(ST[id << 1].f[1][1] + ST[id << 1 | 1].f[0][0], ST[id << 1].f[1][0] + ST[id << 1 | 1].f[1][0]); ST[id].f[1][1] = max(ST[id << 1].f[1][1] + ST[id << 1 | 1].f[0][1], ST[id << 1].f[1][0] + ST[id << 1 | 1].f[1][1]); } } void update(const int &pos) { update(1, 1, n, pos); } int get() { return max({ST[1].f[0][0], ST[1].f[1][0], ST[1].f[0][1], ST[1].f[1][1]}); } }; int a[MAX]; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // freopen("test.inp", "r", stdin); freopen("test.out", "w", stdout); int n, q; cin >> n >> q; for (int i = 1; i <= n; i++) cin >> a[i]; SMT sech(n - 1); for (int i = 1; i < n; i++) { d[i] = a[i + 1] - a[i]; sech.update(i); } while (q--) { int l, r, x; cin >> l >> r >> x; d[l - 1] += x; d[r] -= x; if (l > 0) sech.update(l - 1); if (r < n) sech.update(r); cout << sech.get() << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...