Submission #513867

#TimeUsernameProblemLanguageResultExecution timeMemory
513867blueSjeckanje (COCI21_sjeckanje)C++17
0 / 110
71 ms70064 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; using vi = vector<int>; using vll = vector<ll>; #define sz(x) int(x.size()) const int z = (1<<19); int n, q; vll a; vi wt{0, +1, -1}; const ll INF = 1'000'000'000'000'000'000LL; struct segtree { // ll dp[z][3][3]; //0 = 0, 1 = +, 2 = - // ll lp[z]; ll*** dp; ll* lp; void set_leaf(int i) { for(int u = 0; u <= 2; u++) { for(int v = 0; v <= 2; v++) { if(u != 0 && v != 0) dp[i][u][v] = -INF; else dp[i][u][v] = lp[i] * (wt[u] + wt[v]); } } } void recompute(int i) { for(int u = 0; u <= 2; u++) for(int v = 0; v <= 2; v++) dp[i][u][v] = max(max({dp[2*i][u][0] + dp[2*i+1][0][v], dp[2*i][u][1] + dp[2*i+1][2][v], dp[2*i][u][2] + dp[2*i+1][1][v]}) + lp[i] * (wt[u] + wt[v]), -INF); } void build(int i, int l, int r) { if(l == r) { lp[i] = a[l]; set_leaf(i); } else { build(2*i, l, (l+r)/2); build(2*i+1, (l+r)/2+1, r); recompute(i); } // cerr << "\n\n\n constructed node " << l << ' ' << r << " : \n"; // for(int u = 0; u <= 2; u++) // for(int v = 0; v <= 2; v++) // cerr << u << ' ' << v << " : " << dp[i][u][v] << '\n'; } void add(int i, int l, int r, int L, int R, ll V) { if(R < l || r < L) return; else if(L <= l && r <= R) { lp[i] += V; if(l == r) set_leaf(i); else recompute(i); } else { add(2*i, l, (l+r)/2, L, R, V); add(2*i+1, (l+r)/2+1, r, L, R, V); recompute(i); } } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> q; a = vll(1+n); for(int i = 1; i <= n; i++) cin >> a[i]; segtree S; S.lp = new ll[z]; S.dp = new ll**[z]; for(int u = 0; u < z; u++) { S.dp[u] = new ll*[3]; for(int v = 0; v < 3; v++) S.dp[u][v] = new ll[3]; } S.build(1, 1, n); // for(int u = 0; u <= 2; u++) // for(int v = 0; v <= 2; v++) // cerr << u << ' ' << v << " : " << S.dp[1][u][v] << '\n'; for(int j = 1; j <= q; j++) { ll l, r, v; cin >> l >> r >> v; S.add(1, 1, n, l, r, v); // for(int u = 0; u <= 2; u++) // for(int v = 0; v <= 2; v++) // cerr << u << ' ' << v << " : " << S.dp[1][u][v] << '\n'; cout << S.dp[1][0][0] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...