From 3c58d9001110a6a9477353f0756843d7e8cb1783 Mon Sep 17 00:00:00 2001 From: Segcolt <9hmbzr275@mozmail.com> Date: Thu, 26 Sep 2024 16:34:42 -0300 Subject: [PATCH] Do a problem about merging on a segment tree Hope I can do it for real when it comes --- .../A. Segment with the Maximum Sum.cpp | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 ITMO Academy: pilot course - Segment Tree, part 1 - Step 2/A. Segment with the Maximum Sum.cpp diff --git a/ITMO Academy: pilot course - Segment Tree, part 1 - Step 2/A. Segment with the Maximum Sum.cpp b/ITMO Academy: pilot course - Segment Tree, part 1 - Step 2/A. Segment with the Maximum Sum.cpp new file mode 100644 index 0000000..c3ed4bf --- /dev/null +++ b/ITMO Academy: pilot course - Segment Tree, part 1 - Step 2/A. Segment with the Maximum Sum.cpp @@ -0,0 +1,124 @@ +/* Problem URL: https://codeforces.com/edu/course/2/lesson/4/2/practice/contest/273278/problem/A */ + +#include + +using namespace std; + +#define V vector + +#define rmin(a, b) a = min(a, b) +#define rmax(a, b) a = max(a, b) + +#define rep(i, lim) for (size_t i = 0; i < (lim); i++) +#define nrep(i, s, lim) for (size_t i = s; i < (lim); i++) + +#define repv(i, v) for (auto &i : (v)) +#define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } +#define sortv(v) sort(v.begin(), v.end()) +#define all(v) (v).begin(), (v).end() + +using vi = vector; +using vvi = vector; +using vvvi = vector; +using vvvvi = vector; + +using ll = long long; + +using vl = vector; +using vvl = vector; +using vvvl = vector; +using vvvvl = vector; + +template +auto operator<<(ostream &os, const vector &vec)->ostream& { + os << vec[0]; + for (size_t i = 1; i < vec.size(); i++) { + os << ' ' << vec[i]; + } + os << '\n'; + return os; +} + +template +auto operator>>(istream &is, vector &vec)->istream& { + for (auto &i : vec) { + is >> i; + } + return is; +} + +template +auto operator<<(ostream &os, const vector> &vec)->ostream& { + for (auto &i : vec) { + os << i[0]; + for (size_t j = 1; j < i.size(); j++) { + os << ' ' << i[j]; + } + os << '\n'; + } + return os; +} + +template +auto operator>>(istream &is, vector> &vec)->istream& { + for (auto &i : vec) { + for (auto &j : i) { + is >> j; + } + } + return is; +} + +struct node { + ll ans; + ll sum; + ll pref; + ll suf; + + node(ll ans, ll sum, ll pref, ll suf): ans(ans), sum(sum), pref(pref), suf(suf) {} + node() = default; +}; + +V segtree; + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int n, m; + cin >> n >> m; + vl ar(n); + cin >> ar; + + while (__builtin_popcount(n) != 1) { + ar.push_back(-1); + n++; + } + + segtree.resize(n * 2); + + for (size_t i = n; i < n * 2; i++) { + segtree[i] = node(max(ar[i - n], 0LL), ar[i - n], max(ar[i - n], 0LL), max(ar[i - n], 0LL)); + } + for (size_t i = n - 1; i > 0; i--) { + segtree[i].ans = max(segtree[i * 2].suf + segtree[i * 2 + 1].pref, max(segtree[i * 2].ans, segtree[i * 2 + 1].ans)); + segtree[i].sum = segtree[i * 2].sum + segtree[i * 2 + 1].sum; + segtree[i].pref = max(segtree[i * 2].pref, segtree[i * 2].sum + segtree[i * 2 + 1].pref); + segtree[i].suf = max(segtree[i * 2 + 1].suf, segtree[i * 2 + 1].sum + segtree[i * 2].suf); + } + + cout << segtree[1].ans << '\n'; + while (m--) { + ll i, v; + cin >> i >> v; + segtree[n + i] = node(max(v, 0LL), v, max(v, 0LL), max(v, 0LL)); + for (size_t j = (n + i) / 2; j > 0; j /= 2) { + segtree[j].ans = max(segtree[j * 2].suf + segtree[j * 2 + 1].pref, max(segtree[j * 2].ans, segtree[j * 2 + 1].ans)); + segtree[j].sum = segtree[j * 2].sum + segtree[j * 2 + 1].sum; + segtree[j].pref = max(segtree[j * 2].pref, segtree[j * 2].sum + segtree[j * 2 + 1].pref); + segtree[j].suf = max(segtree[j * 2 + 1].suf, segtree[j * 2 + 1].sum + segtree[j * 2].suf); + } + cout << segtree[1].ans << '\n'; + } +}