Advertisement
Saleh127

Light OJ 1164

Jun 19th, 2021
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 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[402505];
  11. ll a[402005];
  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. cout<<"Case "<<cs<<":"<<endl;
  97. for(i=0; i<=4*n; i++)
  98. {
  99. a[i]=tree[i].sum=tree[i].prop=0ll;
  100. }
  101.  
  102. treeconstruct(1ll,1ll,n);
  103.  
  104. while(q--)
  105. {
  106. cin>>u;
  107.  
  108. if(u==0ll)
  109. {
  110. cin>>j>>k>>l;
  111. j++,k++;
  112. update(1ll,1ll,n,j,k,l);
  113. }
  114. else if(u==1ll)
  115. {
  116. cin>>j>>l;
  117. j++,l++;
  118. m=queries(1ll,1ll,n,j,l,0ll);
  119. cout<<m<<endl;
  120. }
  121. }
  122.  
  123. }
  124.  
  125. return 0;
  126. }
  127.  
  128.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement