shamiul93

LightOJ 1164 - Horrible Queries

Apr 27th, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - 1164 - Horrible Queries
  4.  
  5. Concept - Segment Tree + Lazy Propagation
  6.  
  7. # Very Easy problem on lazy propagation.
  8. # I made a very silly mistake. That took precious 6 hours from my life. -_-
  9. # I'm sure now. আমি একজন বিশাল মাপের বাল হবো । :)
  10. # The mistake -
  11.         seg[sp].sum  += ((hi-lo+1)*x) ;
  12.         seg[sp].prop += x ;
  13.  
  14.         এই দুইটা লাইনে প্লিজ তোরা সবসময় " + " চিহ্ন দিস ভাই । -_-
  15.          ** I was solving MULTQ3 in SPOJ and suddenly noticed this thing by thinking. Didn't notice it in
  16.          Shafayet Vai's Blog.
  17.  
  18.         Other than these, it was a quite easy problem.
  19.  
  20.         *** It has a twin brother in SPOJ - HORRIBLE. Just made some changes and that got AC.
  21. */
  22.  
  23.  
  24. #include <bits/stdc++.h>
  25. #define ll                                      long long
  26. #define fi                                      freopen("in.txt", "r", stdin)
  27. #define fo                                      freopen("out.txt", "w", stdout)
  28. #define m0(a) memset(a , 0 , sizeof(a))
  29. #define m1(a) memset(a , -1 , sizeof(a))
  30.  
  31. #define mx 100009
  32. using namespace std;
  33.  
  34. class node
  35. {
  36. public:
  37.     ll sum ;
  38.     ll prop ;
  39.  
  40.     node()
  41.     {
  42.         sum = prop = 0 ;
  43.     }
  44. } seg[mx*4]  ;
  45.  
  46. ll i, j, idx, N ;
  47.  
  48. node update(ll lo, ll hi, ll sp, ll x)
  49. {
  50.     if(lo > j || hi < i)
  51.     {
  52.         node n ;
  53.         return n ;
  54.     }
  55.     if(lo >= i && hi <= j)
  56.     {
  57.         seg[sp].sum  += ((hi-lo+1)*x) ;
  58.         seg[sp].prop += x ;
  59.         return seg[sp];
  60.     }
  61.     ll mid ;
  62.     mid = (lo + hi) / 2 ;
  63.     update(lo, mid, 2*sp + 1, x) ;
  64.     update(mid + 1, hi, 2*sp + 2, x);
  65.  
  66.     seg[sp].sum = seg[2 * sp + 1].sum + seg[2*sp+2].sum + (hi - lo + 1) * seg[sp].prop ;
  67.     return seg[sp];
  68. }
  69.  
  70. ll query(ll lo, ll hi, ll sp , ll carry )
  71. {
  72.     if(lo > j || hi < i)
  73.     {
  74.         return 0 ;
  75.     }
  76.     if(lo >= i && hi <= j)
  77.     {
  78.         return (seg[sp].sum + ((hi-lo+1)*carry)) ;
  79.     }
  80.  
  81.     ll mid ;
  82.     mid = (lo+hi) / 2 ;
  83.  
  84.     ll l, r ;
  85.     l = query(lo, mid, 2*sp + 1, carry + seg[sp].prop) ;
  86.     r = query(mid + 1, hi, 2*sp+2, carry + seg[sp].prop);
  87.  
  88.     return (l+r) ;
  89. }
  90.  
  91.  
  92. int main()
  93. {
  94. //    fi ;
  95. //    fo ;
  96.     ll t = 0, T ;
  97.     scanf("%lld",&T);
  98.     while(T--)
  99.     {
  100.         t++ ;
  101.         ll q ;
  102.         scanf("%lld %lld",&N, &q ) ;
  103.  
  104.         for(ll k = 0 ; k < mx*4 ; k++)
  105.         {
  106.             seg[k].sum = 0 ;
  107.             seg[k].prop = 0 ;
  108.         }
  109.  
  110.         printf("Case %lld:\n",t);
  111.         while(q--)
  112.         {
  113.             ll c ;
  114.             scanf("%lld",&c) ;
  115.  
  116.             if(c==0)
  117.             {
  118.                 ll v ;
  119.                 scanf("%lld %lld %lld",&i, &j, &v) ;
  120.                 update(0, N-1, 0, v);
  121.             }
  122.             else
  123.             {
  124.                 scanf("%lld %lld",&i, &j);
  125.                 ll ans ;
  126.                 ans = query(0, N-1, 0, 0) ;
  127.                 printf("%lld\n",ans);
  128.             }
  129.         }
  130.     }
  131.     return 0 ;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment