Submission #1174679

#TimeUsernameProblemLanguageResultExecution timeMemory
1174679jioungSjeckanje (COCI21_sjeckanje)C++20
110 / 110
458 ms43956 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define fi first #define se second #define pii pair<int, int> #define pb push_back #define eb emplace_back const int maxn = 2e5 + 5; int n, q; ll a[maxn], d[maxn]; struct Node { ll dp[2][2] = {}; ll bor[2] = {}; Node() {} Node(ll v) { bor[0] = bor[1] = v; dp[0][1] = 0; dp[1][0] = 0; dp[0][0] = 0; dp[1][1] = abs(v); } void update(ll v) { bor[0] += v; bor[1] += v; dp[1][1] = abs(bor[0]); } }; Node combine(Node t, Node u) { Node ret; ret.bor[0] = t.bor[0]; ret.bor[1] = u.bor[1]; for (int l = 0; l < 2; l++) { for (int m = 0; m < 2; m++) { for (int o = 0; o < 2; o++) { for (int r = 0; r < 2; r++) { if (m && o) { if ((t.bor[1] < 0) == (u.bor[0] < 0)) ret.dp[l][r] = max(ret.dp[l][r], t.dp[l][m] + u.dp[o][r]); } else { ret.dp[l][r] = max(ret.dp[l][r], t.dp[l][m] + u.dp[o][r]); } } } } } return ret; } class Seg { private: vector<Node> st; public: Seg(int sz) { st.resize(4 * sz + 1); build(1, 1, sz); } void build(int id, int l, int r) { if (l == r) { st[id] = Node(d[l]); return; } int mid = (l + r) >> 1; build(2 * id, l, mid); build(2 * id + 1, mid + 1, r); st[id] = combine(st[2 * id], st[2 * id + 1]); } void update(int id, int l, int r, int pos, ll val) { if (l > pos || r < pos) return; if (l == r) { st[id].update(val); return; } int mid = (l + r) >> 1; if (pos <= mid) update(2 * id, l, mid, pos, val); else update(2 * id + 1, mid + 1, r, pos, val); st[id] = combine(st[2 * id], st[2 * id + 1]); } ll query() { return st[1].dp[1][1]; } }; signed main() { ios_base::sync_with_stdio(false); 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 - 1; i++) { d[i] = a[i + 1] - a[i]; } Seg segt(n - 1); while (q--) { int l, r; ll x; cin >> l >> r >> x; if (l > 1) { segt.update(1, 1, n - 1, l - 1, x); } if (r < n) { segt.update(1, 1, n - 1, r, -x); } cout << segt.query() << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...