Advertisement
shamiul93

Computing fast avg 1st one

May 5th, 2017
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll                                      long long
  3. #define fi                                      freopen("in.txt", "r", stdin)
  4. #define fo                                      freopen("out.txt", "w", stdout)
  5. #define m0(a) memset(a , 0 , sizeof(a))
  6. #define m1(a) memset(a , -1 , sizeof(a))
  7.  
  8. #define mx 100009
  9. using namespace std;
  10. ll N, i, j ;
  11.  
  12. class node
  13. {
  14. public:
  15.     ll sum   ;
  16.     ll prop ;
  17.  
  18.     node()
  19.     {
  20.         sum = 0 ;
  21.         prop = -1 ;
  22.     }
  23. };
  24.  
  25. node seg[mx*4] ;
  26.  
  27.  
  28. void pushdown(ll lo, ll hi, ll sp)
  29. {
  30.     if(seg[sp].prop == -1)
  31.     {
  32.         return ;
  33.     }
  34.  
  35.     ll mid ;
  36.     mid = (lo+hi) / 2 ;
  37.  
  38.     ll l, r ;
  39.  
  40.     l = mid - lo + 1 ;
  41.     r = hi - (mid + 1) + 1 ;
  42.  
  43.  
  44.     seg[2*sp+1].prop = seg[sp].prop ;
  45.     seg[2*sp+1].sum = seg[sp].prop * l ;
  46.     seg[2*sp+2].prop = seg[sp].prop ;
  47.     seg[2*sp+2].sum = seg[sp].prop * r ;
  48.  
  49.     seg[sp].prop = -1 ;
  50.     return ;
  51. }
  52.  
  53.  
  54. node update(ll lo, ll hi, ll sp, ll x)
  55. {
  56.     if(lo > j || hi < i )
  57.     {
  58.         return node();
  59.     }
  60.     if(lo >= i && hi <= j)
  61.     {
  62.         ll n ;
  63.         n = (hi - lo + 1) ;
  64.  
  65.         seg[sp].prop = x ;
  66.         seg[sp].sum = n * x ;
  67.         return seg[sp] ;
  68.     }
  69.  
  70.     pushdown(lo, hi, sp) ;
  71.  
  72.     ll mid ;
  73.     mid = (lo+hi) / 2 ;
  74.  
  75.  
  76.     update(lo, mid, 2*sp+1, x) ;
  77.     update(mid+1, hi, 2*sp+2, x) ;
  78.  
  79.     seg[sp].sum = seg[2*sp+1].sum + seg[2*sp+2].sum ;
  80.  
  81.  
  82.     return seg[sp] ;
  83. }
  84.  
  85.  
  86. ll query(ll lo, ll hi, ll sp, ll carry)
  87. {
  88.     if(lo > j || hi < i)
  89.     {
  90.         return 0 ;
  91.     }
  92.     if(lo >= i && hi <= j)
  93.     {
  94.         return seg[sp].sum ;
  95.     }
  96.  
  97.     pushdown(lo, hi, sp) ;
  98.  
  99.     ll mid ;
  100.     mid = (lo+hi) / 2 ;
  101.  
  102.     ll l, r ;
  103.     l = query(lo, mid, 2*sp+1,  seg[sp].prop) ;
  104.     r = query(mid+1, hi, 2*sp+2,   seg[sp].prop) ;
  105.  
  106.     return l+r ;
  107. }
  108.  
  109.  
  110. ll gcd(ll a, ll b)
  111. {
  112.     if(a < b)
  113.     {
  114.         swap(a,b) ;
  115.     }
  116.     ll r, d ;
  117.     while(b != 0)
  118.     {
  119.         r = a % b ;
  120.         a = b ;
  121.         b = r ;
  122.     }
  123.     return a ;
  124. }
  125.  
  126. int main()
  127. {
  128. //    fi ;
  129. //    fo ;
  130.     ll T ;
  131.     scanf("%lld",&T);
  132.     ll t = 0 ;
  133.     ll q, c ;
  134.     while(T--)
  135.     {
  136.         for(ll k = 0 ; k < mx*4 ; k++)
  137.         {
  138.             seg[k] = node() ;
  139.         }
  140.  
  141.         t++ ;
  142.         scanf("%lld %lld",&N, &q) ;
  143.         printf("Case %lld:\n",t) ;
  144.         while(q--)
  145.         {
  146.             scanf("%lld",&c) ;
  147.             if(c==2)
  148.             {
  149.                 scanf("%lld %lld",&i, &j) ;
  150.                 ll ans, n ;
  151.                 n = j - i + 1 ;
  152.                 ans = query(0, N-1, 0, 0) ;
  153. //                cout << ans << endl ;
  154.                 if(ans % n == 0)
  155.                 {
  156.                     printf("%lld\n",ans / n) ;
  157.                 }
  158.                 else
  159.                 {
  160.                     printf("%lld/%lld\n",ans / gcd(ans, n), n / gcd(ans, n)) ;
  161.                 }
  162.             }
  163.             else if(c==1)
  164.             {
  165.                 ll v ;
  166.                 scanf("%lld %lld %lld", &i, &j, &v) ;
  167.                 update(0, N-1, 0, v) ;
  168.             }
  169.         }
  170.     }
  171.  
  172.     return 0 ;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement