Advertisement
Shiam7777777

Untitled

Mar 13th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  4. #define ll long long
  5. #define ld double
  6. #define llu long long unsigned
  7.  
  8. #define mx 100001
  9.  
  10. int arr[ mx ];
  11.  
  12. struct info {
  13.     ll prop, sum;
  14. } tree[mx * 3];
  15.  
  16. void init(int node, int b, int e)
  17. {
  18.     if (b == e) {
  19.         tree[node].sum = arr[b];
  20.         return;
  21.     }
  22.     int Left = node << 1;
  23.     int Right = ( node << 1 ) + 1;
  24.     int mid = (b + e) >> 1;
  25.     init(Left, b, mid);
  26.     init(Right, mid + 1, e);
  27.     tree[node].sum = tree[Left].sum + tree[Right].sum;
  28. }
  29.  
  30. void update(int node, int b, int e, int i, int j, int x)
  31. {
  32.     if (i > e || j < b)
  33.         return;
  34.     if (b >= i && e <= j)
  35.     {
  36.         tree[node].sum += ((e - b + 1) * x);    //  adding sum
  37.         tree[node].prop += x;
  38.         return;
  39.     }
  40.     int Left = node << 1;
  41.     int Right = (node << 1) + 1;
  42.     int mid = (b + e) >> 1;
  43.     update(Left, b, mid, i, j, x);
  44.     update(Right, mid + 1, e, i, j, x);
  45.     tree[node].sum = tree[Left].sum + tree[Right].sum + (e - b + 1) * tree[node].prop;
  46. }
  47.  
  48. ll query(int node, int b, int e, int i, int j, int carry = 0)
  49. {
  50.     if (i > e || j < b)
  51.         return 0;
  52.  
  53.     if (b >= i and e <= j)
  54.         return tree[node].sum + carry * (e - b + 1);
  55.  
  56.     int Left = node << 1;
  57.     int Right = (node << 1) + 1;
  58.     int mid = (b + e) >> 1;
  59.  
  60.     ll p1 = query(Left, b, mid, i, j, carry + tree[node].prop);
  61.     ll p2 = query(Right, mid + 1, e, i, j, carry + tree[node].prop);
  62.  
  63.     return p1 + p2;
  64. }
  65.  
  66. int main()
  67. {
  68.     fast;
  69.     int t;
  70.     cin>>t;
  71.     while( t-- )
  72.     {
  73.         memset( arr , 0 , sizeof( arr ) );
  74.         int n , q;
  75.         cin>>n>>q;
  76. //        for( int i = 1 ; i <= n ; i++ )
  77. //            cin>>arr[i];
  78.         init( 1 , 1 , n );
  79.         while( q-- )
  80.         {
  81.             int x;
  82.             cin>>x;
  83.             if( x == 0 )
  84.             {
  85.                 int i , j , val;
  86.                 cin>>i>>j>>val;
  87.                 update( 1 , 1 , n , i , j , val );
  88.             }
  89.             else
  90.             {
  91.                 int i , j;
  92.                 cin>>i>>j;
  93.                 cout<<query( 1 , 1 , n , i , j )<<endl;
  94.             }
  95.         }
  96.  
  97.     }
  98.  
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement