DuongNhi99

GSS (Segment Tree)

Mar 10th, 2022
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e6 + 6;
  5. const int INF = 1e9 + 7;
  6.  
  7. #define left first.first
  8. #define right first.second
  9. #define sum second.first
  10. #define ans second.second
  11.  
  12. long long n, m, a[N];
  13. typedef pair <long long, long long> ii;
  14. typedef pair <ii, ii> iiii;
  15. iiii st[N * 4];
  16.  
  17. void build(int id, int l, int r) {
  18.     if (l == r) {
  19.         st[id] = iiii (ii(a[l], a[l]), ii(a[l], a[l]) );
  20.         return;
  21.     }
  22.    
  23.     int mid = (l+r) / 2;
  24.     build(id * 2, l, mid);
  25.     build(id * 2 + 1, mid + 1,r);
  26.    
  27.     st[id].left = max(st[id*2].left, st[id*2].sum + st[id*2+1].left);
  28.    
  29.     st[id].right = max(st[id*2+1].right, st[id*2+1].sum + st[id*2].right);
  30.    
  31.     st[id].sum = st[id*2].sum + st[id*2+1].sum;
  32.    
  33.     st[id].ans = max (max(st[id*2].ans, st[id*2+1].ans), st[id*2].right + st[id*2+1].left);
  34. }
  35.  
  36. iiii get(int id, int l, int r, int u, int v) {
  37.     if (v < l || r < u)
  38.         return iiii (ii(0,-INF), ii(-INF,-INF));
  39.    
  40.     if (u <= l && r <= v)
  41.         return st[id];
  42.        
  43.     int mid = (l+r) / 2;
  44.    
  45.     iiii t1 = get(id * 2, l, mid, u, v);
  46.     iiii t2 = get(id * 2 + 1, mid + 1, r, u, v);
  47.    
  48.     long long left1 = max(t1.left, t1.sum + t2.left);
  49.     long long right1 = max(t2.right, t2.sum + t1.right);
  50.     long long sum1 = t1.sum + t2.sum;
  51.     long long ans1 = max (max(t1.ans, t2.ans), t1.right + t2.left);
  52.    
  53.     return iiii (ii(left1, right1), ii(sum1, ans1));
  54. }
  55.  
  56. int main()
  57. {
  58.     //freopen("GSS.inp","r",stdin);
  59.     //freopen("GSS.out","w",stdout);
  60.     ios::sync_with_stdio(false);
  61.     cin.tie(NULL); cout.tie(NULL);
  62.    
  63.     cin >> n;
  64.     for (int i = 1;i <= n; i++)
  65.         cin >> a[i];
  66.        
  67.     build(1, 1, n);
  68.    
  69.     cin >> m;
  70.     while (m--) {
  71.         int x, y; cin >> x >> y;
  72.         cout << get(1, 1, n, x, y).ans << '\n';
  73.     }
  74.    
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment