Maruf_Hasan

Segment Tree with Lazy

Apr 11th, 2020
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. ll arr[M];
  2. struct data
  3. {
  4. ll sum,prop;
  5. }tree[4*M];
  6.  
  7. void build(ll node,ll b,ll e)
  8. {
  9. if(b==e)
  10. {
  11. tree[node].sum=0;
  12. tree[node].prop=0;
  13. return;
  14. }
  15. ll mid=(b+e)/2;
  16. ll left=node*2;
  17. ll right=node*2+1;
  18. build(left,b,mid);
  19. build(right,mid+1,e);
  20. tree[node].sum=tree[left].sum+tree[right].sum;
  21.  
  22. }
  23.  
  24. void update(ll node,ll b,ll e,ll i,ll j,ll val)
  25. {
  26. if(i>e || j<b)
  27. return ;
  28. if(b>=i && e<=j)
  29. {
  30. tree[node].sum+=((e-b+1)*val);
  31. tree[node].prop+=val;
  32. return ;
  33. }
  34. ll left=node*2;
  35. ll right=node*2+1;
  36. ll mid=(b+e)/2;
  37. update(left,b,mid,i,j,val);
  38. update(right,mid+1,e,i,j,val);
  39. tree[node].sum=tree[left].sum+tree[right].sum+(e-b+1)*tree[node].prop;
  40. }
  41. ll query(ll node,ll b,ll e,ll i,ll j,ll carry)
  42. {
  43. if(i>e || j<b)
  44. {
  45. return 0;
  46. }
  47. if(b>=i && e<=j)
  48. {
  49. return tree[node].sum+carry*(e-b+1);
  50. }
  51. ll left=node*2;
  52. ll right=node*2+1;
  53. ll mid=(b+e)/2;
  54. ll p1=query(left,b,mid,i,j,carry+tree[node].prop);
  55. ll p2=query(right,mid+1,e,i,j,carry+tree[node].prop);
  56. return p1+p2;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment