Advertisement
Manioc

hld sum interval

Mar 14th, 2019
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 200007
  3. #define INF 1e9 + 7
  4. using namespace std;
  5. typedef long long ll;
  6.  
  7. struct group{
  8.     int left, mid, right, seg;
  9.     group(int _l, int _m, int _r, int _s): left(_l), mid(_m), right(_r), seg(_s) {}
  10.     group(){ left = right = mid = seg = 0;}
  11. };
  12.  
  13. struct ST {
  14.  
  15.     vector<int> seg,left, right, middle, acum, ans, arr;
  16.  
  17.     void get(int id){
  18.         right[id] = right[2*id+1];
  19.         right[id] = max(seg[2*id+1], right[2*id+1]);
  20.         right[id] = max(seg[2*id+1] + right[2*id], right[id]);
  21.         right[id] = max(seg[2*id] + seg[2*id+1], right[id]);
  22.  
  23.         left[id] = left[2*id];
  24.         left[id] = max(seg[2*id], left[2*id]);
  25.         left[id] = max(seg[2*id] + left[2*id+1], left[id]);
  26.         left[id] = max(seg[2*id] + seg[2*id+1], left[id]);
  27.  
  28.         middle[id] = right[2*id] + left[2*id+1];
  29.         middle[id] = max(middle[id], right[2*id] + seg[2*id+1]);
  30.         middle[id] = max(middle[id], seg[2*id] + left[2*id+1]);
  31.         middle[id] = max(middle[id], seg[2*id] + seg[2*id+1]);
  32.  
  33.         seg[id] = seg[2*id] + seg[2*id+1];
  34.         ans[id] = max(left[id], max(middle[id], right[id]));
  35.     }
  36.     void build(int id, int l, int r){
  37.         if(l == r)  seg[id] = left[id] = middle[id] = right[id] = arr[l];
  38.         else{
  39.             int mid = (l+r)/2;
  40.             build(2*id, l, mid);
  41.             build(2*id+1, mid+1, r);
  42.             get(id);
  43.         }
  44.     }
  45.  
  46.     ST(vector<int> a){
  47.         arr = a;
  48.         seg.assign(arr.size(), 0);
  49.         acum.assign(arr.size(), INF);
  50.         build(1, 0, arr.size()-1);
  51.     }
  52.  
  53.     void add(int id, int l, int r, int val){
  54.         if(val != INF) {
  55.             acum[id] = val;
  56.             seg[id] = left[id] = middle[id] = right[id] = val*(r-l+1);
  57.         }
  58.     }
  59.  
  60.     void update(int id, int l, int r, int x, int y, int v){
  61.         if(x > r || l > y) return;
  62.         else if(x <= l && r <= y) add(id, l, r, v);
  63.         else{
  64.             int mid = (l+r)/2;
  65.             add(2*id, l, mid, acum[id]);
  66.             add(2*id+1, mid+1, r, acum[id]);
  67.             acum[id] = INF;
  68.  
  69.             update(2*id, l, mid, x, y, v);
  70.             update(2*id, mid+1, r, x, y, v);
  71.             get(id);
  72.         }
  73.     }
  74.  
  75.     void update(int x, int y, int val){
  76.         if(x < 0 || y > arr.size()-1) return;
  77.         update(1, 0, arr.size()-1, x, y, val);
  78.     }
  79.    
  80.     group query(int id, int l, int r, int x, int y){
  81.         if(x > r || l > y) return group(0, 0, 0, 0);
  82.         else if(x <= l && r <= y) return group(left[id], middle[id], right[id], seg[id]);
  83.         else{
  84.             int mid = (l+r)/2;
  85.             add(2*id, l, mid, acum[id]);
  86.             add(2*id+1, mid+1, r, acum[id]);
  87.             acum[id] = INF;
  88.  
  89.             group q1 =  query(2*id, l, mid, x, y);
  90.             group q2 = query(2*id, mid+1, r, x, y);
  91.             group resp;
  92.             resp.left = q1.left;
  93.             resp.left = max(q1.seg + q2.left, resp.left);
  94.             resp.left = max(q1.seg + q2.seg, resp.left);
  95.  
  96.             resp.right = q2.right;
  97.             resp.right = max(q2.seg + q1.right, resp.right);
  98.             resp.right = max(q1.seg + q2.seg, resp.right);
  99.  
  100.             resp.mid = q1.right + q2.left;
  101.             resp.mid = max(q1.seg + q2.seg, resp.mid);
  102.             resp.mid = max(q1.seg + q2.left, resp.mid);
  103.             resp.mid = max(q1.right + q2.seg, resp.mid);
  104.  
  105.             return resp;
  106.         }
  107.     }
  108.  
  109.     group query(int x, int y){
  110.         if(x < 0 || y > arr.size()-1) return group(-INF, -INF, -INF, -INF);
  111.         return query(1, 0, arr.size()-1, x, y);
  112.     }
  113. };
  114.  
  115. vector<int> arr;
  116. int main(){
  117.     int n; cin >> n;
  118.     for(int i = 0; i < n; i++){
  119.         int x; cin >> x;
  120.         arr.push_back(x);
  121.     }
  122.     ST oi = ST(arr);
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement