Advertisement
esraa_syam

Untitled

Jul 20th, 2024
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. struct node {
  2. ll val;
  3.  
  4. node(){
  5. val = 0;
  6. }
  7.  
  8. node(ll x){
  9. val = x;
  10. }
  11.  
  12. void change(ll x){
  13. val += x;
  14. }
  15. };
  16.  
  17. struct Lazy{
  18. vector < node > tree , lazy;
  19. int tree_size;
  20.  
  21. Lazy(int n){
  22. tree_size = 1;
  23. while (tree_size < n) tree_size *= 2;
  24. tree.assign(2 * tree_size , node(1e18));
  25. lazy.assign(2 * tree_size , node());
  26. }
  27.  
  28. node merge(node a , node b){
  29. node res = node();
  30. res.val = min(a.val , b.val);
  31. return res;
  32. }
  33.  
  34. void build(vector < ll > &v , int x , int lx , int rx){
  35. if(rx - lx == 1){
  36. if(lx < sz(v)) tree[x] = node(v[lx]);
  37. return;
  38. }
  39.  
  40. int m = (lx + rx) / 2;
  41. build(v , 2 * x + 1 , lx , m);
  42. build(v , 2 * x + 2 , m , rx);
  43. tree[x] = merge(tree[2 * x + 1] , tree[2 * x + 2]);
  44. }
  45.  
  46. void build(vector < ll > &v){
  47. build(v , 0 , 0 , tree_size);
  48. }
  49.  
  50. void push(int x , int lx , int rx){
  51. if(lazy[x].val){
  52. tree[x].val += lazy[x].val;
  53. if(rx - lx != 1){
  54. lazy[2 * x + 1].val += lazy[x].val;
  55. lazy[2 * x + 2].val += lazy[x].val;
  56. }
  57. lazy[x].val = 0;
  58. }
  59. }
  60.  
  61. void update(int l , int r , int val , int x , int lx , int rx){
  62. push(x , lx , rx);
  63. if(lx >= r || rx <= l) return;
  64. if(lx >= l && rx <= r){
  65. tree[x].val += val;
  66. if(rx - lx != 1){
  67. lazy[x * 2 + 1].val += val;
  68. lazy[x * 2 + 2].val += val;
  69. }
  70. return;
  71. }
  72.  
  73. int m = (lx + rx) / 2;
  74. update(l , r , val , 2 * x + 1 , lx , m);
  75. update(l , r , val , 2 * x + 2 , m , rx);
  76. tree[x] = merge(tree[2 * x + 1] , tree[2 * x + 2]);
  77. }
  78.  
  79. void update(int l , int r , int val){
  80. update(l , r , val , 0 , 0 , tree_size);
  81. }
  82.  
  83. node query(int l , int r , int x , int lx , int rx){
  84. push(x , lx , rx);
  85. if(lx >= r || rx <= l) return node(1e18);
  86. if(lx >= l && rx <= r) return tree[x];
  87.  
  88. int m = (lx + rx) / 2;
  89. node left = query(l , r , 2 * x + 1 , lx , m);
  90. node right = query(l , r , 2 * x + 2 , m , rx);
  91. return merge(left , right);
  92. }
  93.  
  94. node query(int l , int r) {
  95. return query(l, r, 0, 0, tree_size);
  96. }
  97.  
  98. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement