Submission #712778

#TimeUsernameProblemLanguageResultExecution timeMemory
712778JohannSjeckanje (COCI21_sjeckanje)C++14
110 / 110
373 ms34892 KiB
#include "bits/stdc++.h" using namespace std; typedef long long ll; typedef vector<ll> vi; typedef vector<vi> vvi; #define sz(x) (int)(x).size() struct item { ll first, last; ll dp[2][2]; item() {} item(ll v) { first = last = v; dp[0][0] = 0; // contains neither first nor last dp[0][1] = 0; // contains not first but last dp[1][0] = 0; // contains first and not last dp[1][1] = abs(v); // contains first and last } }; struct segtree { int size; vector<item> arr; void combine(int x, item &a, item &b) { arr[x].first = a.first, arr[x].last = b.last; for (int i = 0; i < 4; ++i) { arr[x].dp[i / 2][i % 2] = max(a.dp[i / 2][0] + b.dp[1][i % 2], a.dp[i / 2][1] + b.dp[0][i % 2]); if (a.last * b.first > 0) arr[x].dp[i / 2][i % 2] = max(arr[x].dp[i / 2][i % 2], a.dp[i / 2][1] + b.dp[1][i % 2]); } } void init(vi &D) { size = 1; while (size < sz(D)) size *= 2; arr.resize(2 * size); for (int i = 0; i < sz(D); ++i) arr[i + size] = item(D[i]); for (int i = size - 1; i > 0; --i) combine(i, arr[2 * i], arr[2 * i + 1]); } void add(int i, ll c) { add(i, c, 1, 0, size); } void add(int i, ll c, int x, int lx, int rx) { if (rx - lx == 1) { arr[x] = item(arr[x].first + c); return; } int m = (lx + rx) / 2; if (i < m) add(i, c, 2 * x, lx, m); else add(i, c, 2 * x + 1, m, rx); combine(x, arr[2 * x], arr[2 * x + 1]); } ll query() { return arr[1].dp[1][1]; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int N, Q; cin >> N >> Q; vi A(N); for (int i = 0; i < N; ++i) cin >> A[i]; vi D(N, 0); // D[i] = A[i] - A[i - 1], D[0] = 0; for (int i = 1; i < N; ++i) D[i] = A[i] - A[i - 1]; segtree seg; seg.init(D); for (int q = 0; q < Q; ++q) { ll l, r, x; cin >> l >> r >> x; --l; if (l > 0) seg.add(l, x); if (r < sz(D)) seg.add(r, -x); cout << seg.query() << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...