Advertisement
tuki2501

gss.cpp

Nov 16th, 2021
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define taskname "gss"
  5.  
  6. // typedef long long ll;
  7. #define int long long
  8.  
  9. void ioset() {
  10.   cin.tie(0)->sync_with_stdio(0);
  11.   if (fopen(taskname".in", "r")) {
  12.     freopen(taskname".in", "r", stdin);
  13.     // freopen(taskname".out", "w", stdout);
  14.   }
  15. }
  16.  
  17. const int INF = 0x3f3f3f3f;
  18.  
  19. template<typename T>
  20. bool chmax(T &a, T b) {
  21.   return a < b ? a = b, true : false;
  22. }
  23.  
  24. struct Data {
  25.   int sum, max, maxl, maxr;
  26.   Data() { sum = max = maxl = maxr = -INF; }
  27.   Data(int x) { sum = max = maxl = maxr = x; }
  28. };
  29.  
  30. struct Node {
  31.   Data data;
  32.   Node *lef, *rig;
  33.   Node() { lef = rig = nullptr; }
  34. };
  35.  
  36. struct SMT {
  37.   int n; Node *node;
  38.   Data merge(Data lef, Data rig) {
  39.     Data node;
  40.     node.sum  = lef.sum + rig.sum;
  41.     node.maxl = max(lef.maxl, lef.sum + rig.maxl);
  42.     node.maxr = max(rig.maxr, rig.sum + lef.maxr);
  43.     node.max  = max(lef.max, rig.max);
  44.     chmax(node.max, lef.maxr + rig.maxl);
  45.     return node;
  46.   }
  47.   void build(Node *&node, int l, int r, vector<int> &a) {
  48.     if (l > r) return;
  49.     if (node == nullptr) node = new Node;
  50.     if (l == r) {
  51.       node->data = Data(a[l]);
  52.       return;
  53.     }
  54.     int m = (l + r) / 2;
  55.     build(node->lef, l, m, a);
  56.     build(node->rig, m + 1, r, a);
  57.     node->data = merge(node->lef->data, node->rig->data);
  58.   }
  59.   SMT(int n, vector<int> &a): n(n) {
  60.     node = new Node;
  61.     build(node, 0, n - 1, a);
  62.   }
  63.   Data get(Node *&node, int l, int r, int u, int v) {
  64.     if (r < u || l > v) return Data();
  65.     if (l >= u && r <= v) return node->data;
  66.     int m = (l + r) / 2;
  67.     return merge(get(node->lef, l, m, u, v), get(node->rig, m + 1, r, u, v));
  68.   }
  69.   Data get(int u, int v) {
  70.     return get(node, 0, n - 1, u, v);
  71.   }
  72. };
  73.  
  74. void solve() {
  75.   int n; cin >> n;
  76.   vector<int> a(n);
  77.   for (auto &i : a) cin >> i;
  78.   SMT smt(n, a);
  79.   int q; cin >> q;
  80.   while (q--) {
  81.     int u, v;
  82.     cin >> u >> v;
  83.     u--; v--;
  84.     cout << smt.get(u, v).max << '\n';
  85.   }
  86. }
  87.  
  88. signed main() {
  89.   ioset();
  90.   solve();
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement