Submission #1188064

#TimeUsernameProblemLanguageResultExecution timeMemory
1188064qrnSjeckanje (COCI21_sjeckanje)C++20
0 / 110
2 ms4160 KiB
#include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> using namespace std; // using namespace __gnu_pbds; #define pb push_back #define ins insert #define fi first #define se second #define endl "\n" #define ALL(x) x.begin(), x.end() #define intt int const intt mod = 1e9 + 7; const intt base = 9973; const intt inf = 1e9; const intt mxN = 5e5 + 5; const intt L = 21; struct nod { char so,sa; intt vv, vy, yv, yy; }; nod seg[4 * mxN]; vector<intt> A(mxN), AA(mxN); intt N; nod merge(nod &l, nod &r) { nod ret; if(l.sa != r.so) { ret.vv = max(l.vv + r.yv, l.vy + r.vv); ret.vy = max(l.vy + r.vy, l.vv + r.yy); ret.yv = max(l.yv + r.yv, l.yy + r.vv); ret.yy = max(l.yv + r.yy, l.yy + r.vy); } else { ret.vv = l.vv + r.vv; ret.vy = l.vv + r.vy; ret.yv = l.yv + r.vv; ret.yy = l.yv + r.vy; } ret.so = l.so; ret.sa = r.sa; return ret; } void build(intt node, intt l, intt r) { if(l == r) { if(AA[l] < 0) seg[node].so = seg[node].sa = '-'; else seg[node].sa = seg[node].so = '+'; seg[node].vv = seg[node].vy = seg[node].yy = seg[node].yv = 0; seg[node].vv = abs(AA[l]); // cout << seg[node].vv << ": " << seg[node].so << " " << seg[node].sa << endl; return; } intt mid = (l + r) / 2; build(node * 2, l, mid); build(node * 2 + 1, mid + 1, r); seg[node] = merge(seg[node * 2], seg[node * 2 + 1]); } void update(intt node, intt l, intt r, intt pos, intt val, intt type) { if(pos <= 0 || pos >= N+1) return; if(l == r) { if(type == 1) { if(seg[node].so == '-') { seg[node].vv += val; } else { if(seg[node].vv < val) { seg[node].so = seg[node].sa = '-'; seg[node].vv = (val - seg[node].vv); } else { seg[node].vv -= val; } } if(seg[node].vv == 0) { seg[node].so = seg[node].sa = '+'; } } else { if(seg[node].so == '+') { seg[node].vv += val; } else { if(seg[node].vv < val) { seg[node].so = seg[node].sa = '+'; seg[node].vv = (val - seg[node].vv); } else { seg[node].vv -= val; } } } seg[node].vy = seg[node].yv = seg[node].yy = 0; // cout << "ASD: " << seg[node].vv << ": " << seg[node].so << endl; return; } intt mid = (l + r) / 2; if(pos <= mid) { update(node * 2, l, mid, pos, val, type); } else { update(node * 2 + 1, mid + 1, r, pos, val, type); } seg[node] = merge(seg[node * 2], seg[node * 2 + 1]); } intt get(intt node, intt l, intt r, intt ql, intt qr) { if(ql > r || qr < l || ql > qr) return 0; if(ql <= l && r <= qr) { return seg[node].vv; } intt mid = (l + r) / 2; return get(node * 2, l, mid, ql, qr) + get(node * 2 + 1, mid + 1, r, ql, qr); } void solve() { intt Q; cin >> N >> Q; for(intt i = 1; i <= N; i++) { cin >> A[i]; } for(intt i = 1; i <= N - 1; i++) { AA[i] = A[i] - A[i+1]; } --N; build(1, 1, N); while(Q--) { intt l, r, val; cin >> l >> r >> val; --l; update(1, 1, N, l, val, 1); update(1, 1, N, r, val, 2); cout << get(1, 1, N, 1, N) << endl; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); intt tst = 1; // cin >> tst; while(tst--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...