Submission #386329

#TimeUsernameProblemLanguageResultExecution timeMemory
386329phathnvSjeckanje (COCI21_sjeckanje)C++11
55 / 110
575 ms620 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3007; const ll INF = 1e18; int n, q, a[N]; ll b[N], dp[N][2]; int getSign(ll x){ if (x < 0) return -1; else if (x == 0) return 0; else return 1; } struct Node{ ll dp[2][2], leftVal, rightVal; Node(int x = 0){ dp[0][0] = 0; dp[1][1] = abs(x); dp[0][1] = dp[1][0] = -INF; leftVal = rightVal = x; } void update(ll delta){ leftVal += delta; rightVal += delta; } Node operator + (const Node &oth){ Node res; res.leftVal = leftVal; res.rightVal = oth.rightVal; for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) res.dp[i][j] = -INF; for(int a = 0; a < 2; a++) for(int b = 0; b < 2; b++) for(int c = 0; c < 2; c++) for(int d = 0; d < 2; d++){ ll val = dp[a][b] + oth.dp[c][d]; if (b && c && getSign(rightVal) * getSign(oth.leftVal) == -1) val -= min(abs(rightVal), abs(oth.leftVal)); res.dp[a][d] = max(res.dp[a][d], val); } return res; } }; struct segmentTree{ }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> q; if (max(n, q) > 3000) return 0; for(int i = 1; i <= n; i++) cin >> a[i]; for(int i = 1; i < n; i++) b[i] = a[i + 1] - a[i]; while (q--){ int l, r, x; cin >> l >> r >> x; if (l > 1) b[l - 1] += x; if (r < n) b[r] -= x; Node res(b[1]); for(int i = 2; i < n; i++) res = res + Node(b[i]); cout << max(max(res.dp[0][0], res.dp[0][1]), max(res.dp[1][0], res.dp[1][1])) << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...