ProgMe

Untitled

Jan 5th, 2024
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int int64_t
  3.  
  4. using namespace std;
  5.  
  6. struct vertex {
  7.     int sum;
  8.     int maxpref, pref_index;
  9.     int maxsuf, suf_index;
  10.     int ans;
  11.     int ans_l, ans_r;
  12. };
  13.  
  14. int n;
  15. vector<int> a;
  16. vector<vertex> t;
  17.  
  18. void build(int v = 1, int tl = 0, int tr = n - 1) {
  19.     if (tl == tr) {
  20.         t[v].ans_l = t[v].ans_r = t[v].suf_index = t[v].pref_index = tl;
  21.         t[v].sum = t[v].maxpref = t[v].maxsuf = t[v].ans = a[tl];
  22.         return;
  23.     }
  24.  
  25.     int tm = (tl + tr) / 2;
  26.  
  27.     build(v * 2, tl, tm);
  28.     build(v * 2 + 1, tm + 1, tr);
  29.  
  30.     t[v].sum = t[v * 2].sum + t[v * 2 + 1].sum;
  31.     if (t[v * 2].maxpref < t[v * 2].sum + t[v * 2 + 1].maxpref) {
  32.         t[v].pref_index = t[v * 2 + 1].pref_index;
  33.         t[v].maxpref = t[v * 2].sum + t[v * 2 + 1].maxpref;
  34.     } else {
  35.         t[v].pref_index = t[v * 2].pref_index;
  36.         t[v].maxpref = t[v * 2].maxpref;
  37.     }
  38.     if (t[v * 2 + 1].maxsuf < t[v * 2 + 1].sum + t[v * 2].maxsuf) {
  39.         t[v].suf_index = t[v * 2].suf_index;
  40.         t[v].maxsuf = t[v * 2 + 1].sum + t[v * 2].maxsuf;
  41.     } else {
  42.         t[v].suf_index = t[v * 2 + 1].suf_index;
  43.         t[v].maxsuf = t[v * 2 + 1].maxsuf;
  44.     }
  45.     if (max({t[v * 2].ans, t[v * 2 + 1].ans,
  46.              t[v * 2].maxsuf + t[v * 2 + 1].maxpref}) == t[v * 2].ans) {
  47.         t[v].ans_l = t[v * 2].ans_l;
  48.         t[v].ans_r = t[v * 2].ans_r;
  49.         t[v].ans = t[v * 2].ans;
  50.     } else if (max({t[v * 2].ans, t[v * 2 + 1].ans,
  51.                     t[v * 2].maxsuf + t[v * 2 + 1].maxpref}) == t[v * 2 + 1].ans) {
  52.         t[v].ans_l = t[v * 2 + 1].ans_l;
  53.         t[v].ans_r = t[v * 2 + 1].ans_r;
  54.         t[v].ans = t[v * 2 + 1].ans;
  55.     } else {
  56.         t[v].ans_l = t[v * 2].suf_index;
  57.         t[v].ans_r = t[v * 2 + 1].pref_index;
  58.         t[v].ans = t[v * 2].maxsuf + t[v * 2 + 1].maxpref;
  59.     }
  60. }
  61.  
  62. int32_t main() {
  63.     ios::sync_with_stdio(false);
  64.     cin.tie(nullptr);
  65.  
  66.     cin >> n;
  67.     a.resize(n);
  68.     t.resize(4 * n);
  69.  
  70.     for (int i = 0; i < n; i++) {
  71.         cin >> a[i];
  72.     }
  73.  
  74.     build();
  75.  
  76.     cout << t[1].ans_l + 1 << ' ' << t[1].ans_r + 1 << ' ' << t[1].ans;
  77. }
  78.  
Add Comment
Please, Sign In to add comment