Advertisement
Pearlfromsu

c++ segment tree with lazy propagation for sum 11.09.23

Sep 11th, 2023
1,110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.71 KB | None | 0 0
  1. /*
  2. РУБРИКА "АНЕКИ В КОММЕНТАХ"
  3. "
  4. В дверь постучали 1024 раза.
  5. - Килобайт - подумал Штирлиц.
  6. - Не угадал, подумали 10 сороконожек и 78 осьминогов
  7. "
  8. */
  9.  
  10. #pragma warning(disable: 4996)
  11. #pragma warning(disable: 6031)
  12.  
  13. #include <iostream>
  14. #include <vector>
  15. #include <string>
  16. #include <algorithm>
  17. #include <queue>
  18. #include <cmath>
  19. #include <math.h>
  20. #include <set>
  21. #include <stack>
  22. #include <iomanip>
  23. #include <random>
  24. #define ll long long
  25.  
  26. using namespace std;
  27.  
  28. vector<int> tree, add;
  29. int k;
  30.  
  31. void insert(int ind, int value) {
  32.     int uk1 = k + ind;
  33.     tree[uk1] = value;
  34.     while (uk1 != 0) {
  35.         tree[uk1 / 2] = tree[(uk1 / 2)*2] + tree[(uk1 / 2)*2 + 1];
  36.         uk1 /= 2;
  37.     }
  38. }
  39. int getSum(int v, int tl, int tr, int l, int r) {
  40.     //cout << "  " << tl << " " << tr << "  " << l << "  " << r << "  v: " << v << ": " << tree[v] << '\n';
  41.     if (r <= tl || l >= tr)
  42.         return 0;
  43.  
  44.     if (add[v] != 0) {
  45.         tree[v] += (tr - tl) * add[v];
  46.         if (tr - tl > 1) {
  47.             add[v * 2] = add[v];
  48.             add[v * 2 + 1] = add[v];
  49.         }
  50.         add[v] = 0;
  51.     }
  52.     if (tl >= l && tr <= r)
  53.         return tree[v];
  54.     int mid = tl + (tr - tl) / 2;
  55.     return getSum(v * 2, tl, mid, l, r) + getSum(v * 2+1, mid, tr, l, r);
  56. }
  57. void addRange(int v, int tl, int tr, int l, int r, int value) {
  58.     if (r <= tl || l >= tr)
  59.         return;
  60.     if (tl >= l && tr <= r) {
  61.         add[v] += value;
  62.         return;
  63.     }
  64.  
  65.     int mid = tl + (tr - tl) / 2;
  66.     addRange(v * 2, tl, mid, l, r, value);
  67.     addRange(v * 2 + 1, mid, tr, l, r, value);
  68. }
  69.  
  70. int  main() {
  71.     ios::sync_with_stdio(false);
  72.     cin.tie(NULL);
  73.     cout.tie(NULL);
  74.     //cout << fixed << setprecision(5);
  75.  
  76. #ifdef _DEBUG
  77.     freopen("input.txt", "r", stdin);
  78.     //freopen("output.txt", "w", stdout);
  79. #else
  80.     //freopen("input.txt", "r", stdin);
  81.     //freopen("output.txt", "w", stdout);
  82. #endif // !DEBUG
  83.     //setlocale(LC_ALL, "Russian");
  84.  
  85.     //18:42
  86.     //19:00
  87.     int n;
  88.     cin >> n;
  89.     k = 1;
  90.     while (k < n)
  91.         k *= 2;
  92.     tree.resize(4*n+1, 0);
  93.     add.resize(4 * n + 1, 0);
  94.     vector<int> vc(n);
  95.     for (int i = 0; i < n; i++) {
  96.         cin >> vc[i];
  97.         insert(i, vc[i]);
  98.     }
  99.     for (int i = 0; i < n * 4; i++) {
  100.         cout << tree[i] << ' ';
  101.     }
  102.     cout << '\n';
  103.     for (int i = 0; i < n; i++)
  104.         cout << getSum(1, 0, k, i, i + 1) << ' ';
  105.     cout << '\n';
  106.     addRange(1, 0, k, 1, n, 2);
  107.     addRange(1, 0, k, 1, n-1, 1);
  108.     for (int i = 0; i < n; i++)
  109.         cout << getSum(1, 0, k, i, i + 1) << ' ';
  110.     cout << '\n';
  111.  
  112.     return 0;
  113. }
  114.  
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement