fedor-resh

SegTree add on range and RMQ

Feb 14th, 2024 (edited)
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <sstream>
  5. using ll = long long;
  6. using namespace std;
  7. ll inf = 1e10;
  8. struct Node{
  9.     Node(ll min = inf): min(min){};
  10.     ll min;
  11.     ll push = 0;
  12. };
  13.  
  14. struct SegTree{
  15.     vector<Node> tree;
  16.     int size;
  17.     SegTree(vector<int> &arr){
  18.         size = arr.size();
  19.         tree.resize(size*4);
  20.         build(0, 0, size, arr);
  21.     }
  22.  
  23.     Node combine(Node a, Node b){
  24.         return Node(min(a.min, b.min));
  25.     }
  26.     void build(ll v, ll l, ll r, vector<int> &arr){
  27.         if(l + 1 == r){
  28.             tree[v] = Node(arr[l]);
  29.             return;
  30.         }
  31.         ll m = (l+r)/2;
  32.         build(v*2+1, l, m, arr);
  33.         build(v*2+2, m, r, arr);
  34.         tree[v] = combine(tree[v*2+1], tree[v*2+2]);
  35.     }
  36.     void push(ll v, ll l, ll r){
  37.         if(l+1 == r){
  38.             return;
  39.         }
  40.         tree[v*2+1].push += tree[v].push;
  41.         tree[v*2+2].push += tree[v].push;
  42.         tree[v*2+1].min += tree[v].push;
  43.         tree[v*2+2].min += tree[v].push;
  44.         tree[v].push = 0;
  45.     }
  46.  
  47.     void update(ll v, ll cl, ll cr, ll ql, ll qr, ll val){
  48.         push(v, cl, cr);
  49.         if(qr <= cl || cr <= ql){
  50.             return;
  51.         }
  52.         if(ql <= cl && cr <= qr){
  53.             tree[v].push += val;
  54.             tree[v].min += val;
  55.             return;
  56.         }
  57.  
  58.         ll mid = (cl+cr)/2;
  59.         update(v*2+1, cl, mid, ql, qr, val);
  60.         update(v*2+2, mid, cr, ql, qr, val);
  61.         tree[v] = combine(tree[v*2+1], tree[v*2+2]);
  62.     }
  63.  
  64.     void update(ll l, ll r, ll val){
  65.         update(0, 0, size, l, r, val);
  66.     }
  67.  
  68.     Node get(ll v, ll cl, ll cr, ll l, ll r){
  69.         push(v, cl, cr);
  70.         if(r <= cl || cr <= l){
  71.             return Node();
  72.         }
  73.         if(l <= cl && cr <= r){
  74.             return tree[v];
  75.         }
  76.         ll mid = (cl+cr)/2;
  77.         Node lval = get(v*2+1, cl, mid, l, r);
  78.         Node rval = get(v*2+2, mid, cr, l, r);
  79.         return combine(lval, rval);
  80.     };
  81.  
  82.     ll get(ll l, ll r){
  83.         return get(0, 0, size, l, r).min;
  84.     };
  85.  
  86.     void print(){
  87.         cout << "tree: ";
  88.         for(int i = 0; i < size*4; i++){
  89.             cout << tree[i].min << " ";
  90.         }
  91.         cout << endl;
  92.     }
  93. };
  94.  
  95.  
  96.  
  97. int main(){
  98.     string line;
  99.     int n;
  100.     cin >> n;
  101.     vector<int> arr(n);
  102.     for(int i = 0; i < n; i++){
  103.         cin >> arr[i];
  104.     }
  105.  
  106.     SegTree st(arr);
  107.     int q;
  108.     cin >> q;
  109.     getline(cin, line);
  110.     for(int i = 0; i < q; i++) {
  111.         getline(cin, line);
  112.         stringstream ss(line);
  113.         vector<ll> nums;
  114.         ll num;
  115.         while(ss >> num){
  116.             nums.push_back(num);
  117.         }
  118.         if(nums.size() == 2){
  119.             if(nums[0] <= nums[1]){
  120.                 cout << st.get(nums[0], nums[1]+1) << endl;
  121.             }
  122.             else{
  123.                 cout << min(st.get(nums[0], n), st.get(0, nums[1]+1)) << endl;
  124.             }
  125.         }else{
  126.             if(nums[0] <= nums[1]){
  127.                 st.update(nums[0], nums[1]+1, nums[2]);
  128.             }
  129.             else{
  130.                 st.update(nums[0], n, nums[2]);
  131.                 st.update(0, nums[1]+1, nums[2]);
  132.             }
  133.         }
  134.     }
  135.  
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment