Advertisement
Saleh127

Lazy Propagation

Jun 15th, 2021
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define test int t; cin>>t; for(int cs=1;cs<=t;cs++)
  5.  
  6. struct tr{
  7.  
  8. ll sum=0,prop=0;
  9.  
  10. }tree[400505];
  11. ll a[200005];
  12. ///tr tree[400505];
  13.  
  14. void treeconstruct(ll node,ll b,ll e)
  15. {
  16.  
  17. if(b==e)
  18. {
  19. tree[node].sum=a[b];
  20. return;
  21. }
  22.  
  23. ll left = node*2;
  24. ll right = node*2 + 1ll;
  25.  
  26. ll mid=(b+e)/2;
  27.  
  28. treeconstruct(left,b,mid);
  29. treeconstruct(right,mid+1ll,e);
  30.  
  31. tree[node].sum=tree[left].sum+tree[right].sum;
  32.  
  33. }
  34.  
  35. ll queries(ll node,ll b,ll e,ll i,ll j,ll s)
  36. {
  37. if(i>e || j<b) return 0ll;
  38.  
  39. if(b>=i && e<=j)
  40. {
  41. return tree[node].sum+(e-b+1ll)*s;
  42. }
  43.  
  44.  
  45. ll left = node*2;
  46. ll right = node*2 + 1ll;
  47.  
  48. ll mid=(b+e)/2;
  49.  
  50. ll x=queries(left,b,mid,i,j,s+tree[node].prop);
  51.  
  52. ll y=queries(right,mid+1ll,e,i,j,s+tree[node].prop);
  53.  
  54. return x+y;
  55.  
  56. }
  57.  
  58. void update(ll node,ll b,ll e,ll i,ll j,ll newv)
  59. {
  60. if(i>e || j<b) return;
  61.  
  62. if(b>=i && e<=j)
  63. {
  64. ll w=(e-b+1ll);
  65.  
  66. tree[node].sum+=(w*newv);
  67. tree[node].prop+=newv;
  68. return;
  69. }
  70.  
  71. ll left = node*2;
  72. ll right = node*2 + 1ll;
  73.  
  74. ll mid=(b+e)/2;
  75.  
  76. update(left,b,mid,i,j,newv);
  77.  
  78. update(right,mid+1ll,e,i,j,newv);
  79.  
  80. tree[node].sum=tree[left].sum + tree[right].sum + (e-b+1)*tree[node].prop;
  81.  
  82. }
  83.  
  84. int main()
  85. {
  86. ios_base::sync_with_stdio(0);
  87. cin.tie(0);
  88. cout.tie(0);
  89.  
  90. test
  91. {
  92. ll q,n,m,i,j,k,l,u;
  93.  
  94. cin>>n>>q;
  95.  
  96. for(i=0; i<=4*n; i++)
  97. {
  98. a[i]=tree[i].sum=tree[i].prop=0ll;
  99. }
  100.  
  101. treeconstruct(1ll,1ll,n);
  102.  
  103. while(q--)
  104. {
  105. cin>>u;
  106.  
  107. if(u==0ll)
  108. {
  109. cin>>j>>k>>l;
  110. update(1ll,1ll,n,j,k,l);
  111. }
  112. else if(u==1ll)
  113. {
  114. cin>>j>>l;
  115. m=queries(1ll,1ll,n,j,l,0ll);
  116. cout<<m<<endl;
  117. }
  118. }
  119.  
  120. }
  121.  
  122. return 0;
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement