Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int int64_t
- using namespace std;
- struct vertex {
- int sum;
- int maxpref, pref_index;
- int maxsuf, suf_index;
- int ans;
- int ans_l, ans_r;
- };
- int n;
- vector<int> a;
- vector<vertex> t;
- void build(int v = 1, int tl = 0, int tr = n - 1) {
- if (tl == tr) {
- t[v].ans_l = t[v].ans_r = t[v].suf_index = t[v].pref_index = tl;
- t[v].sum = t[v].maxpref = t[v].maxsuf = t[v].ans = a[tl];
- return;
- }
- int tm = (tl + tr) / 2;
- build(v * 2, tl, tm);
- build(v * 2 + 1, tm + 1, tr);
- t[v].sum = t[v * 2].sum + t[v * 2 + 1].sum;
- if (t[v * 2].maxpref < t[v * 2].sum + t[v * 2 + 1].maxpref) {
- t[v].pref_index = t[v * 2 + 1].pref_index;
- t[v].maxpref = t[v * 2].sum + t[v * 2 + 1].maxpref;
- } else {
- t[v].pref_index = t[v * 2].pref_index;
- t[v].maxpref = t[v * 2].maxpref;
- }
- if (t[v * 2 + 1].maxsuf < t[v * 2 + 1].sum + t[v * 2].maxsuf) {
- t[v].suf_index = t[v * 2].suf_index;
- t[v].maxsuf = t[v * 2 + 1].sum + t[v * 2].maxsuf;
- } else {
- t[v].suf_index = t[v * 2 + 1].suf_index;
- t[v].maxsuf = t[v * 2 + 1].maxsuf;
- }
- if (max({t[v * 2].ans, t[v * 2 + 1].ans,
- t[v * 2].maxsuf + t[v * 2 + 1].maxpref}) == t[v * 2].ans) {
- t[v].ans_l = t[v * 2].ans_l;
- t[v].ans_r = t[v * 2].ans_r;
- t[v].ans = t[v * 2].ans;
- } else if (max({t[v * 2].ans, t[v * 2 + 1].ans,
- t[v * 2].maxsuf + t[v * 2 + 1].maxpref}) == t[v * 2 + 1].ans) {
- t[v].ans_l = t[v * 2 + 1].ans_l;
- t[v].ans_r = t[v * 2 + 1].ans_r;
- t[v].ans = t[v * 2 + 1].ans;
- } else {
- t[v].ans_l = t[v * 2].suf_index;
- t[v].ans_r = t[v * 2 + 1].pref_index;
- t[v].ans = t[v * 2].maxsuf + t[v * 2 + 1].maxpref;
- }
- }
- int32_t main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cin >> n;
- a.resize(n);
- t.resize(4 * n);
- for (int i = 0; i < n; i++) {
- cin >> a[i];
- }
- build();
- cout << t[1].ans_l + 1 << ' ' << t[1].ans_r + 1 << ' ' << t[1].ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment