Advertisement
shamiul93

SPOJ Horrible Queries

Apr 27th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - SPOJ - HORRIBLE QUERIES
  4.  
  5. Concept - Segment Tree + Lazy Propagation
  6.  
  7.         *** It's totally same as my solution for it's twin in LightOJ. Just some changes. I pasted it here for no reason.
  8.         *** If you have seen the other one, you can ignore it totally.  
  9.         *** It has a twin brother in LightOJ - HORRIBLE Query. Just made some changes and that got AC.
  10. */
  11.  
  12.  
  13. #include <bits/stdc++.h>
  14. #define ll                                      long long
  15. #define fi                                      freopen("in.txt", "r", stdin)
  16. #define fo                                      freopen("out.txt", "w", stdout)
  17. #define m0(a) memset(a , 0 , sizeof(a))
  18. #define m1(a) memset(a , -1 , sizeof(a))
  19.  
  20. #define mx 100009
  21. using namespace std;
  22.  
  23. class node
  24. {
  25. public:
  26.     ll sum ;
  27.     ll prop ;
  28.  
  29.     node()
  30.     {
  31.         sum = prop = 0 ;
  32.     }
  33. } seg[mx*4]  ;
  34.  
  35. ll i, j, idx, N ;
  36.  
  37. node update(ll lo, ll hi, ll sp, ll x)
  38. {
  39.     if(lo > j || hi < i)
  40.     {
  41.         node n ;
  42.         return n ;
  43.     }
  44.     if(lo >= i && hi <= j)
  45.     {
  46.         seg[sp].sum  += ((hi-lo+1)*x) ;
  47.         seg[sp].prop += x ;
  48.         return seg[sp];
  49.     }
  50.     ll mid ;
  51.     mid = (lo + hi) / 2 ;
  52.     update(lo, mid, 2*sp + 1, x) ;
  53.     update(mid + 1, hi, 2*sp + 2, x);
  54.  
  55.     seg[sp].sum = seg[2 * sp + 1].sum + seg[2*sp+2].sum + (hi - lo + 1) * seg[sp].prop ;
  56.     return seg[sp];
  57. }
  58.  
  59. ll query(ll lo, ll hi, ll sp , ll carry )
  60. {
  61.     if(lo > j || hi < i)
  62.     {
  63.         return 0 ;
  64.     }
  65.     if(lo >= i && hi <= j)
  66.     {
  67.         return (seg[sp].sum + ((hi-lo+1)*carry)) ;
  68.     }
  69.  
  70.     ll mid ;
  71.     mid = (lo+hi) / 2 ;
  72.  
  73.     ll l, r ;
  74.     l = query(lo, mid, 2*sp + 1, carry + seg[sp].prop) ;
  75.     r = query(mid + 1, hi, 2*sp+2, carry + seg[sp].prop);
  76.  
  77.     return (l+r) ;
  78. }
  79.  
  80.  
  81. int main()
  82. {
  83. //    fi ;
  84. //    fo ;
  85.     ll t = 0, T ;
  86.     scanf("%lld",&T);
  87.     while(T--)
  88.     {
  89. //        t++ ;
  90.         ll q ;
  91.         scanf("%lld %lld",&N, &q ) ;
  92.  
  93.         for(ll k = 0 ; k < mx*4 ; k++)
  94.         {
  95.             seg[k].sum = 0 ;
  96.             seg[k].prop = 0 ;
  97.         }
  98.  
  99. //        printf("Case %lld:\n",t);
  100.         while(q--)
  101.         {
  102.             ll c ;
  103.             scanf("%lld",&c) ;
  104.  
  105.             if(c==0)
  106.             {
  107.                 ll v ;
  108.                 scanf("%lld %lld %lld",&i, &j, &v) ;
  109.                 i-- ;
  110.                 j-- ;
  111.                 update(0, N-1, 0, v);
  112.             }
  113.             else
  114.             {
  115.                 scanf("%lld %lld",&i, &j);
  116.                 i-- ;
  117.                 j-- ;
  118.                 ll ans ;
  119.                 ans = query(0, N-1, 0, 0) ;
  120.                 printf("%lld\n",ans);
  121.             }
  122.         }
  123.     }
  124.     return 0 ;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement