Advertisement
prog3r

LAZY ST, += on [l,r] , get_segment

Mar 6th, 2025
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. signed main() {
  5.     int T;
  6.     cin >> T;
  7.     struct Node {
  8.         int lazy = 0;
  9.         int val = 0;
  10.     };
  11.     auto relax = [&] (vector<Node>& tree, int u, int tl, int tr) -> void {
  12.         int tm = (tl + tr) >> 1;
  13.         int szl = tm-tl+1;
  14.         int szr = tr-(tm+1)+1;
  15.         tree[2*u+1].lazy += tree[u].lazy;
  16.         tree[2*u+1].val += tree[u].lazy*szl;
  17.         tree[2*u+2].lazy += tree[u].lazy;
  18.         tree[2*u+2].val += tree[u].lazy*szr;
  19.         tree[u].lazy = 0;
  20.     };
  21.     auto inc = [&] (auto f, vector<Node>& tree, int u, int tl, int tr, int l, int r, int val) -> void {
  22.         if (tl == l && tr == r) {
  23.             tree[u].val += val*(tr-tl+1);
  24.             tree[u].lazy += val;
  25.             return;
  26.         }
  27.         relax(tree, u, tl, tr);
  28.         int tm = (tl + tr) >> 1;
  29.         if (l <= tm) {
  30.             f(f, tree, 2*u+1, tl, tm, l, min(r, tm), val);
  31.         }
  32.         if (r >= tm+1) {
  33.             f(f, tree, 2*u+2, tm+1, tr, max(l, tm+1), r, val);
  34.         }
  35.         tree[u].val = tree[2*u+1].val + tree[2*u+2].val;
  36.     };
  37.     auto gt = [&] (auto f, vector<Node>& tree, int u, int tl, int tr, int l, int r) -> int {
  38.         if (tl == l && tr == r) {
  39.             return tree[u].val;
  40.         }
  41.         relax(tree, u, tl, tr);
  42.         int tm = (tl + tr) >> 1;
  43.         int ret = 0;
  44.         if (l <= tm) {
  45.             ret += f(f, tree, 2*u+1, tl, tm, l, min(r, tm));
  46.         }
  47.         if (r >= tm+1) {
  48.             ret += f(f, tree, 2*u+2, tm+1, tr, max(l, tm+1), r);
  49.         }
  50.         return ret;
  51.     };
  52.     vector<Node> ST(3'000'000);
  53.     for (int tt = 0; tt < T; tt += 1) {
  54.         int n;
  55.         cin >> n;
  56.         fill(ST.begin(), ST.begin()+4*n+10, Node{});
  57.         inc(inc, ST, 0, 1, n, 1, 3, 5);
  58.         int q;
  59.         cin >> q;
  60.         for (int i = 0; i < q; i += 1) {
  61. //            int tp;
  62. //            cin >> tp;
  63. //            if (tp == 1) {
  64. //
  65. //            }
  66.             int l, r;
  67.             cin >> l >> r;
  68.             cout << gt(gt, ST, 0, 1, n, l, r) << "\n";
  69.         }
  70.     }
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement