Advertisement
sak1b

seg_tree_lazy_prp

Feb 1st, 2018
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define mx 300005
  3. using namespace std;
  4.  
  5. struct info {
  6. int prop, sum;
  7. } tree[mx * 4];
  8.  
  9. int arr[mx];
  10.  
  11. void init(int node, int b, int e)
  12. {
  13. if (b == e) {
  14. tree[node].sum = arr[b];
  15. tree[node].prop=0;
  16. return;
  17. }
  18. int Left = node * 2;
  19. int Right = node * 2 + 1;
  20. int mid = (b + e) / 2;
  21. init(Left, b, mid);
  22. init(Right, mid + 1, e);
  23. tree[node].sum = tree[Left].sum + tree[Right].sum;
  24. }
  25.  
  26. void update(int node, int b, int e, int i, int j, int x)
  27. {
  28. if (i > e || j < b)
  29. return;
  30. if (b >= i && e <= j)
  31. {
  32. tree[node].sum += ((e - b + 1) * x);
  33. tree[node].prop += x;
  34. return;
  35. }
  36. int Left = node * 2;
  37. int Right = (node * 2) + 1;
  38. int mid = (b + e) / 2;
  39. update(Left, b, mid, i, j, x);
  40. update(Right, mid + 1, e, i, j, x);
  41. tree[node].sum = tree[Left].sum + tree[Right].sum + (e - b + 1) * tree[node].prop;
  42.  
  43. }
  44.  
  45. int query(int node, int b, int e, int i, int j, int carry = 0)
  46. {
  47. if (i > e || j < b)
  48. return 0;
  49.  
  50. if (b >= i and e <= j)
  51. return tree[node].sum + carry * (e - b + 1);
  52.  
  53. int Left = node << 1;
  54. int Right = (node << 1) + 1;
  55. int mid = (b + e) >> 1;
  56.  
  57. int p1 = query(Left, b, mid, i, j, carry + tree[node].prop);
  58. int p2 = query(Right, mid + 1, e, i, j, carry + tree[node].prop);
  59.  
  60. return p1 + p2;
  61. }
  62.  
  63. int main()
  64. {
  65. freopen("input.txt","r",stdin);
  66. int n,t,cs=1,q;
  67. int x,y;
  68. int type;
  69.  
  70. scanf("%d%d",&n,&q);
  71.  
  72. for(int i=1;i<=n;i++)
  73. {
  74. scanf("%d",&arr[i]);
  75. }
  76.  
  77. init(1,1,n);
  78.  
  79. while(q--)
  80. {
  81. scanf("%d",&type);
  82. if(type==1)
  83. {
  84. scanf("%d%d",&x,&y);
  85. update(1,1,n,x,y,5); //here 5 is the inc value
  86. }
  87. else
  88. {
  89. scanf("%d%d",&x,&y);
  90. int z=query(1,1,n,x,y);
  91. printf("%d\n",z);
  92. }
  93.  
  94. }
  95.  
  96.  
  97.  
  98.  
  99. return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement