Advertisement
leoanjos

The Child and The Sequence

Dec 14th, 2021
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define long long long int
  6.  
  7. struct SegmentTreeBeats {
  8. private:
  9.     struct Node {
  10.         int mn, mx;
  11.         long sum;
  12.  
  13.         Node(): mn(0), mx(0), sum(0LL) {}
  14.         Node(int mn, int mx, long sum): mn(mn), mx(mx), sum(sum) {}
  15.  
  16.         Node operator +(Node other) {
  17.             return Node(min(mn, other.mn), max(mx, other.mx), sum + other.sum);
  18.         }
  19.     };
  20.  
  21.     int n;
  22.     vector<int> a;
  23.     vector<Node> tree;
  24.     vector<int> lazy;
  25.  
  26. public:
  27.     SegmentTreeBeats(int n, vector<int> &a) {
  28.         this->n = n;
  29.         this->a = a;
  30.  
  31.         tree.resize(4 * n);
  32.         lazy.assign(4 * n, -1);
  33.  
  34.         build(1, 1, n);
  35.     }
  36.  
  37.     void update(int i, int x) {
  38.         update(1, 1, n, i, x);
  39.     }
  40.  
  41.     void update(int l, int r, int x) {
  42.         update(1, 1, n, l, r, x);
  43.     }
  44.  
  45.     long query(int l, int r) {
  46.         return query(1, 1, n, l, r);
  47.     }
  48.  
  49. private:
  50.     void build(int node, int l, int r) {
  51.         if (l == r) tree[node] = Node(a[l], a[l], a[l]);
  52.         else {
  53.             int mid = (l + r) / 2;
  54.             build(2 * node, l, mid);
  55.             build(2 * node + 1, mid + 1, r);
  56.             tree[node] = tree[2 * node] + tree[2 * node + 1];
  57.         }
  58.     }
  59.  
  60.     void update_lazy(int node, int l, int r, int x) {
  61.         assert(tree[node].mx == tree[node].mn);
  62.  
  63.         tree[node].mx = tree[node].mn = x;
  64.         tree[node].sum = (r - l + 1LL) * x;
  65.         lazy[node] = x;
  66.     }
  67.  
  68.     void push_down(int node, int l, int r) {
  69.         if (lazy[node] == -1) return;
  70.  
  71.         int mid = (l + r) / 2;
  72.         update_lazy(2 * node, l, mid, lazy[node]);
  73.         update_lazy(2 * node + 1, mid + 1, r, lazy[node]);
  74.         lazy[node] = -1;
  75.     }
  76.  
  77.     void update(int node, int l, int r, int i, int x) {
  78.         if (l == r) tree[node] = Node(x, x, x);
  79.         else {
  80.             push_down(node, l, r);
  81.  
  82.             int mid = (l + r) / 2;
  83.             if (i <= mid) update(2 * node, l, mid, i, x);
  84.             else update(2 * node + 1, mid + 1, r, i, x);
  85.             tree[node] = tree[2 * node] + tree[2 * node + 1];
  86.         }
  87.     }
  88.  
  89.     void update(int node, int l, int r, int ul, int ur, int x) {
  90.         if (r < ul || l > ur || tree[node].mx < x) return;
  91.         if (ul <= l && r <= ur && tree[node].mx == tree[node].mn) {
  92.             update_lazy(node, l, r, tree[node].mx % x);
  93.             return;
  94.         }
  95.  
  96.         push_down(node, l, r);
  97.  
  98.         int mid = (l + r) / 2;
  99.         update(2 * node, l, mid, ul, ur, x);
  100.         update(2 * node + 1, mid + 1, r, ul, ur, x);
  101.         tree[node] = tree[2 * node] + tree[2 * node + 1];
  102.     }
  103.  
  104.     long query(int node, int l, int r, int ql, int qr) {
  105.         if (r < ql || l > qr) return 0LL;
  106.         if (ql <= l && r <= qr) return tree[node].sum;
  107.  
  108.         push_down(node, l, r);
  109.  
  110.         int mid = (l + r) / 2;
  111.         return query(2 * node, l, mid, ql, qr) + query(2 * node + 1, mid + 1, r, ql, qr);
  112.     }
  113. };
  114.  
  115. int main() {
  116.     ios_base::sync_with_stdio(false);
  117.     cin.tie(NULL);
  118.  
  119.     int n, m;
  120.     cin >> n >> m;
  121.  
  122.     vector<int> a(n + 1);
  123.     for (int i = 1; i <= n; i++)
  124.         cin >> a[i];
  125.  
  126.     SegmentTreeBeats tree(n, a);
  127.     while (m--) {
  128.         int op; cin >> op;
  129.         if (op == 1) {
  130.             int l, r;
  131.             cin >> l >> r;
  132.  
  133.             long ans = tree.query(l, r);
  134.             cout << ans << "\n";
  135.         } else if (op == 2) {
  136.             int l, r, x;
  137.             cin >> l >> r >> x;
  138.             tree.update(l, r, x);
  139.         } else {
  140.             int k, x;
  141.             cin >> k >> x;
  142.             tree.update(k, x);
  143.         }
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement