Advertisement
shamiul93

SPOJ MULTQ3

Apr 28th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3.  
  4. Problem - SPOJ MULTQ3
  5.  
  6. Concept -
  7.  
  8. Segment Tree , LP
  9. সেইম প্রব্লেম লাইট ওজে তে আছে , করসি । ওইটা দেখ । :3 - Link - https://pastebin.com/i3mg0tSV
  10.  
  11. */
  12.  
  13.  
  14. #include <bits/stdc++.h>
  15. #define ll                                      long long
  16. #define fi                                      freopen("in.txt", "r", stdin)
  17. #define fo                                      freopen("out.txt", "w", stdout)
  18. #define m0(a) memset(a , 0 , sizeof(a))
  19. #define m1(a) memset(a , -1 , sizeof(a))
  20.  
  21. #define mx 100009
  22. using namespace std;
  23.  
  24.  
  25. ll i, j, idx, N ;
  26.  
  27. class node
  28. {
  29. public:
  30.     ll zero,  one, two, prop ;
  31.     node()
  32.     {
  33.         one = two = zero =  prop =  0 ;
  34.  
  35.     }
  36. } seg[mx*4];
  37.  
  38.  
  39. node build(ll lo, ll hi, ll sp)
  40. {
  41.     if(lo == hi)
  42.     {
  43.         seg[sp].zero = seg[sp].zero + 1 ;
  44.         return seg[sp];
  45.     }
  46.     ll mid ;
  47.     mid = (lo + hi) / 2 ;
  48.  
  49.     node l, r ;
  50.     l = build(lo, mid, 2*sp+1) ;
  51.     r = build(mid+1, hi, 2*sp+2) ;
  52.  
  53.     seg[sp].zero = l.zero + r.zero ;
  54. //    seg[sp].one = l.one + r.one ;
  55. //    seg[sp].two = l.two + r.two ;
  56.     return seg[sp] ;
  57. }
  58.  
  59.  
  60. node propagate(node a, ll x)
  61. {
  62.     a.prop += x ;
  63.     swap(a.zero, a.one) ;
  64.     swap(a.zero, a.two) ;
  65.     return a ;
  66. }
  67.  
  68.  
  69. node loopPropagate(node a, ll x)
  70. {
  71.     for(ll m = 0 ; m < x ; m++)
  72.     {
  73.         swap(a.zero, a.one) ;
  74.         swap(a.zero, a.two) ;
  75.     }
  76.     return a ;
  77. }
  78.  
  79.  
  80. node update(ll lo, ll hi, ll sp, ll x)
  81. {
  82.     if(lo > j || hi < i)
  83.     {
  84.         node n ;
  85.         return n;
  86.     }
  87.     if(lo >= i && hi <= j)
  88.     {
  89.         seg[sp] = propagate(seg[sp], x) ;
  90.         return seg[sp] ;
  91.     }
  92.     ll mid ;
  93.     mid = (lo + hi) / 2 ;
  94.  
  95.     update(lo, mid, 2*sp+1, x) ;
  96.     update(mid+1, hi, 2*sp+2, x) ;
  97.  
  98.     seg[sp].zero = seg[2*sp+1].zero + seg[2*sp+2].zero ;
  99.     seg[sp].one = seg[2*sp+1].one + seg[2*sp+2].one ;
  100.     seg[sp].two = seg[2*sp+1].two + seg[2*sp+2].two ;
  101.  
  102.     seg[sp] = loopPropagate(seg[sp], seg[sp].prop % 3) ;
  103.  
  104.     return seg[sp] ;
  105. }
  106.  
  107.  
  108. ll query(ll lo, ll hi, ll sp, ll carry)
  109. {
  110.     if(lo > j || hi < i)
  111.     {
  112.         return 0 ;
  113.     }
  114.     if(lo >= i && hi <= j)
  115.     {
  116.         node n ;
  117.         n = loopPropagate(seg[sp], carry % 3) ;
  118.         return n.zero ;
  119.     }
  120.  
  121.     ll mid ;
  122.     mid = (lo + hi) / 2 ;
  123.  
  124.     ll l, r ;
  125.     l = query(lo, mid, 2*sp+1, carry + seg[sp].prop) ;
  126.     r = query(mid+1, hi, 2*sp+2, carry+seg[sp].prop) ;
  127.  
  128.     return (l+r) ;
  129. }
  130.  
  131. int main()
  132. {
  133.     for(int k = 0 ; k < mx*4 ; k++)
  134.     {
  135.         seg[k].zero = 0 ;
  136.         seg[k].one = 0  ;
  137.         seg[k].two = 0 ;
  138.         seg[k].prop = 0 ;
  139.     }
  140.     ll q ;
  141.     scanf("%lld %lld",&N, &q) ;
  142.     build(0, N-1, 0) ;
  143.     while(q--)
  144.     {
  145.         ll c ;
  146.         scanf("%lld %lld %lld",&c, &i, &j) ;
  147.         if(c==0)
  148.         {
  149.             update(0, N-1, 0, 1) ;
  150.         }
  151.         else
  152.         {
  153.             ll ans ;
  154.             ans = query(0, N-1, 0, 0) ;
  155.             printf("%lld\n",ans);
  156.         }
  157.     }
  158.     return 0 ;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement