Advertisement
leoanjos

Assignment and Sum

Feb 3rd, 2022
159
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.  
  3. using namespace std;
  4.  
  5. #define long long long int
  6.  
  7. struct SegmentTree {
  8. private:
  9.     int n;
  10.     vector<int> lazy;
  11.     vector<long> tree;
  12.  
  13. public:
  14.     SegmentTree(int n) {
  15.         this->n = n;
  16.         lazy.assign(4 * n, -1);
  17.         tree.assign(4 * n, 0LL);
  18.     }
  19.  
  20.     void update(int l, int r, int v) {
  21.         update(1, 1, n, l, r, v);
  22.     }
  23.  
  24.     long query(int l, int r) {
  25.         return query(1, 1, n, l, r);
  26.     }
  27.  
  28. private:
  29.     void update_lazy(int node, int l, int r, int v) {
  30.         tree[node] = v * (r - l + 1LL);
  31.         lazy[node] = v;
  32.     }
  33.  
  34.     void push_down(int node, int l, int r) {
  35.         if (lazy[node] == -1) return;
  36.  
  37.         int m = (l + r) / 2;
  38.         update_lazy(2 * node, l, m, lazy[node]);
  39.         update_lazy(2 * node + 1, m + 1, r, lazy[node]);
  40.         lazy[node] = -1;
  41.     }
  42.  
  43.     void update(int node, int l, int r, int ul, int ur, int v) {
  44.         if (r < ul || l > ur) return;
  45.         if (ul <= l && r <= ur) {
  46.             update_lazy(node, l, r, v);
  47.             return;
  48.         }
  49.  
  50.         push_down(node, l, r);
  51.  
  52.         int m = (l + r) / 2;
  53.         update(2 * node, l, m, ul, ur, v);
  54.         update(2 * node + 1, m + 1, r, ul, ur, v);
  55.         tree[node] = tree[2 * node] + tree[2 * node + 1];
  56.     }
  57.  
  58.     long query(int node, int l, int r, int ql, int qr) {
  59.         if (r < ql || l > qr) return 0LL;
  60.         if (ql <= l && r <= qr) return tree[node];
  61.  
  62.         push_down(node, l, r);
  63.  
  64.         int m = (l + r) / 2;
  65.         long left = query(2 * node, l, m, ql, qr);
  66.         long right = query(2 * node + 1, m + 1, r, ql, qr);
  67.         return left + right;
  68.     }
  69. };
  70.  
  71. int main() {
  72.     ios_base::sync_with_stdio(false);
  73.     cin.tie(NULL);
  74.  
  75.     int n, m;
  76.     cin >> n >> m;
  77.  
  78.     SegmentTree tree(n);
  79.     while (m--) {
  80.         int op; cin >> op;
  81.         if (op == 1) {
  82.             int l, r, v;
  83.             cin >> l >> r >> v;
  84.             tree.update(l + 1, r, v);
  85.         } else {
  86.             int l, r;
  87.             cin >> l >> r;
  88.  
  89.             long ans = tree.query(l + 1, r);
  90.             cout << ans << "\n";
  91.         }
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement