Submission #566247

#TimeUsernameProblemLanguageResultExecution timeMemory
566247Tam_theguideSjeckanje (COCI21_sjeckanje)C++14
110 / 110
720 ms29604 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const ll INF = 1e18; int n , q; ll a[200005], d[200005]; struct node{ ll a[2][2]; void init(){ for (int i = 0; i <= 1; i++){ for (int j = 0; j <= 1; j++){ a[i][j] = -INF; } } } }; node seg[800005]; void push(int root, int tl, int tr){ int tm = (tl + tr) / 2; node c1 = seg[2 * root], c2 = seg[2 * root + 1]; ll tmp[2][2]; for (int i = 0; i <= 1; i++) for (int j = 0; j <= 1; j ++) tmp[i][j] = -1e18; for (int i = 0; i <= 1; i++){ for (int j = 0; j <= 1; j++){ for (int t = 0; t <= 1; t++){ for (int k = 0; k <= 1; k++){ if (c1.a[i][j] != -INF && c2.a[t][k] != -INF){ if (j == 1 && t == 1 && d[tm] * d[tm + 1] < 0) continue; tmp[i][k] = max(tmp[i][k], c1.a[i][j] + c2.a[t][k]); } } } } } for (int i = 0; i <= 1; i++) for (int j = 0; j <= 1;j ++) seg[root].a[i][j] = tmp[i][j]; } void buildtree(int root, int tl, int tr){ if (tl == tr){ seg[root].init(); seg[root].a[1][1] = abs(d[tl]); seg[root].a[0][0] = 0; return; } int tm = (tl + tr) / 2; buildtree(2 * root, tl, tm); buildtree(2 * root + 1, tm + 1, tr); push(root, tl, tr); } void update(int root, int tl, int tr, int pos){ if (tl == tr){ seg[root].init(); seg[root].a[1][1] = abs(d[tl]); seg[root].a[0][0] = 0; return; } int tm = (tl + tr) / 2; if (pos <= tm) update(2 * root, tl, tm, pos); else update(2 * root + 1, tm + 1, tr, pos); push(root, tl, tr); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i < n;i++) d[i] = a[i] - a[i + 1]; //for (int i = 0; i <= 4 * n; i++) seg[i].init(); //cout << seg[1].a[0][1] + INF; buildtree(1, 1, n - 1); while (q--){ int l, r; ll x; cin >> l >> r >> x; d[l - 1] -= x; d[r] += x; update(1, 1, n - 1, l - 1); update(1, 1, n - 1, r); cout << max({seg[1].a[0][0], seg[1].a[0][1], seg[1].a[1][1], seg[1].a[1][0]}) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...