Submission #1118238

#TimeUsernameProblemLanguageResultExecution timeMemory
1118238ThunnusSjeckanje (COCI21_sjeckanje)C++17
110 / 110
729 ms50760 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; #define int i64 #define vi vector<int> #define vvi vector<vi> #define vb vector<bool> #define pii pair<int, int> #define fi first #define se second #define sz(x) (int)(x).size() struct SegTree{ struct Node{ int dp[2][2] = {}; int borders[2] = {}; Node() {} Node(int val) { dp[0][0] = dp[0][1] = dp[1][0] = 0; dp[1][1] = abs(val); borders[0] = borders[1] = val; } inline void node_update(int val){ borders[0] += val, borders[1] += val; dp[1][1] = abs(borders[0]); return; } }; vector<Node> st; SegTree(int n) : st(4 * n) {} inline Node combine(Node &a, Node &b){ Node c; c.borders[0] = a.borders[0], c.borders[1] = b.borders[1]; // [ ][ ] // l mo r // m and o same -> taken segments are combined for(int l = 0; l < 2; l++){ for(int r = 0; r < 2; r++){ for(int m = 0; m < 2; m++){ for(int o = 0; o < 2; o++){ if(m && o){ if((a.borders[1] < 0) == (b.borders[0] < 0)){ c.dp[l][r] = max(c.dp[l][r], a.dp[l][m] + b.dp[o][r]); } } else{ c.dp[l][r] = max(c.dp[l][r], a.dp[l][m] + b.dp[o][r]); } } } } } return c; } inline void update(int pos, int val, int v, int tl, int tr){ if(tl == tr){ st[v].node_update(val); return; } int mid = (tl + tr) / 2; if(pos <= mid){ update(pos, val, 2 * v, tl, mid); } else{ update(pos, val, 2 * v + 1, mid + 1, tr); } st[v] = combine(st[2 * v], st[2 * v + 1]); return; } }; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; vi a(n), diff(n - 1); for(int i = 0; i < n; i++){ cin >> a[i]; if(i){ diff[i - 1] = a[i] - a[i - 1]; } } SegTree st(n - 1); for(int i = 0; i < n - 1; i++){ st.update(i + 1, diff[i], 1, 1, n - 1); } while(q--){ int l, r, x; cin >> l >> r >> x; if(l - 1 >= 1) st.update(l - 1, x, 1, 1, n - 1); if(r <= n - 1) st.update(r, -x, 1, 1, n - 1); cout << st.st[1].dp[1][1] << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...