Advertisement
shamiul93

Computing fast avg 2nd one

May 5th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.87 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. struct node
  13. {
  14.     ll sum   ;
  15.     ll prop ;
  16. };
  17.  
  18. typedef struct node node ;
  19.  
  20. node seg[mx*5] ;
  21.  
  22.  
  23. void pushdown(ll lo, ll hi, ll sp)
  24. {
  25.     if(seg[sp].prop == -1)
  26.     {
  27.         return ;
  28.     }
  29.  
  30.     ll mid ;
  31.     mid = (lo+hi) / 2 ;
  32.  
  33.     ll l, r ;
  34.  
  35.     l = mid - lo + 1 ;
  36.     r = hi - (mid + 1) + 1 ;
  37.  
  38.  
  39.     seg[2*sp+1].prop = seg[sp].prop ;
  40.     seg[2*sp+1].sum = seg[sp].prop * l ; // what is the point of update it ..... you have already put it in your lazy
  41.     seg[2*sp+2].prop = seg[sp].prop ;
  42.     seg[2*sp+2].sum = seg[sp].prop * r ; // same problem
  43.  
  44.     seg[sp].prop = -1 ;
  45.     return ;
  46. }
  47.  
  48. // what is the point of returning a node????
  49. node update(ll lo, ll hi, ll sp, ll x)
  50. {
  51.     //you have to push down first cause what if there is a update but you return
  52.  
  53.     if(lo > j || hi < i )
  54.     {
  55.         return node();
  56.     }
  57.     if(lo >= i && hi <= j)
  58.     {
  59.         ll n ;
  60.         n = (hi - lo + 1) ;
  61.  
  62.         seg[sp].prop = x ;
  63.         seg[sp].sum = n * x ;
  64.         //what about lazy tree you don't update it
  65.         //you just update your current node
  66.         //also you dont clear your current lazy
  67.         return seg[sp] ;
  68.     }
  69.  
  70.     pushdown(lo, hi, sp) ; // this potion going in top
  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.     return seg[sp] ;
  82. }
  83.  
  84.  
  85. ll query(ll lo, ll hi, ll sp)
  86. {
  87.     //you have to push down first cause what if there is a update but you return
  88.  
  89.     if(lo > j || hi < i)
  90.     {
  91.         return 0 ;
  92.     }
  93.     if(lo >= i && hi <= j)
  94.     {
  95.         ll n ;
  96.         n = hi - lo + 1 ;
  97.         return seg[sp].sum ;
  98.     }
  99.  
  100.     pushdown(lo, hi, sp) ; // same problem
  101.  
  102.     ll mid ;
  103.     mid = (lo+hi) / 2 ;
  104.  
  105.     ll r = 0  ;
  106.     r += query(lo, mid, 2*sp+1) ;
  107.     r += query(mid+1, hi, 2*sp+2) ;
  108.  
  109.     return r ;
  110. }
  111.  
  112. //i think its ok ... but you can double check it
  113. ll gcd(ll a, ll b)
  114. {
  115.     if(a < b)
  116.     {
  117.         swap(a,b) ;
  118.     }
  119.     ll r, d ;
  120.     while(b != 0)
  121.     {
  122.         r = a % b ;
  123.         a = b ;
  124.         b = r ;
  125.     }
  126.     return a ;
  127. }
  128.  
  129. int main()
  130. {
  131. //    fi ;
  132. //    fo ;
  133.     ll T ;
  134.     scanf("%lld",&T);
  135.     ll t = 0 ;
  136.     ll q, c ;
  137.     while(T--)
  138.     {
  139.         for(ll k = 0 ; k < mx*5 ; k++)
  140.         {
  141.             seg[k].sum = 0  ;
  142.             seg[k].prop = -1 ;
  143.         }
  144.  
  145.         t++ ;
  146.         scanf("%lld %lld",&N, &q) ;
  147. //        cout << q << endl ;
  148.         printf("Case %lld:\n",t) ;
  149.         while(q--)
  150.         {
  151.             scanf("%lld",&c) ;
  152.             if(c==2)
  153.             {
  154.                 scanf("%lld %lld",&i, &j) ;
  155.                 ll ans, n ;
  156.                 n = j - i + 1 ;
  157.                 ans = query(0, N-1, 0) ;
  158. //                cout << ans << endl ;
  159.                 if(ans % n == 0)
  160.                 {
  161.                     printf("%lld\n",ans / n) ;
  162.                 }
  163.                 else
  164.                 {
  165.                     ll g = gcd(ans, n) ;
  166.                     ll nom, denom ;
  167.                     nom = ans /  g ;
  168.                     denom = n / g ;
  169.                     printf("%lld/%lld\n",nom, denom) ;
  170.                 }
  171. //                if(q!=0)
  172. //                {
  173. //                    printf("\n") ;
  174. //                }
  175.             }
  176.             else if(c==1)
  177.             {
  178.                 ll v ;
  179.                 scanf("%lld %lld %lld", &i, &j, &v) ;
  180.                 update(0, N-1, 0, v) ;
  181.             }
  182.         }
  183.     }
  184.  
  185.     return 0 ;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement