Advertisement
erfanul007

LOJ 1183

Sep 9th, 2021
1,192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5.  
  6. const int N = 131075;
  7.  
  8.  
  9. ll Tree[2 * N];
  10. ll Lazy[2 * N];
  11. bool Lazyache[2 * N];
  12.  
  13. void UpdateTree(int node, int L, int R, int TL, int TR, ll val){
  14.     int Left = node * 2;
  15.     int Right = Left + 1;
  16.     int mid = (L+R)/2;
  17.  
  18.     if(Lazyache[node]){
  19.         Tree[node] = Lazy[node] * (R-L+1);
  20.         if(L < R){
  21.             Lazy[Left] = Lazy[node];
  22.             Lazy[Right] = Lazy[node];
  23.  
  24.             Lazyache[Left] = 1;
  25.             Lazyache[Right] = 1;
  26.         }
  27.         Lazy[node] = 0;
  28.         Lazyache[node] = 0;
  29.     }
  30.     if(TL > R || TR < L) return;
  31.  
  32.     if(TL <= L && TR >= R){
  33.         Tree[node] = val * (R-L+1);
  34.         if(L < R){
  35.             Lazy[Left] = val;
  36.             Lazy[Right] = val;
  37.  
  38.             Lazyache[Left] = 1;
  39.             Lazyache[Right] = 1;
  40.         }
  41.         return;
  42.     }
  43.  
  44.     UpdateTree(Left, L, mid, TL, TR, val);
  45.     UpdateTree(Right, mid + 1, R, TL, TR, val);
  46.  
  47.     Tree[node] = Tree[Left] + Tree[Right];
  48. }
  49.  
  50. ll Query(int node, int L, int R, int TL, int TR){
  51.     int Left = node * 2;
  52.     int Right = Left + 1;
  53.     int mid = (L+R)/2;
  54.  
  55.     if(Lazyache[node]){
  56.         Tree[node] = Lazy[node] * (R-L+1);
  57.         if(L < R){
  58.             Lazy[Left] = Lazy[node];
  59.             Lazy[Right] = Lazy[node];
  60.  
  61.             Lazyache[Left] = 1;
  62.             Lazyache[Right] = 1;
  63.         }
  64.         Lazy[node] = 0;
  65.         Lazyache[node] = 0;
  66.     }
  67.     if(TL > R || TR < L) return 0;
  68.  
  69.     if(TL <= L && TR >= R) return Tree[node];
  70.  
  71.     return Query(Left, L, mid, TL, TR) + Query(Right, mid + 1, R, TL, TR);
  72. }
  73.  
  74.  
  75. int main(){
  76.     #ifdef ERFANUL007
  77.         clock_t tStart = clock();
  78.         freopen("input.txt", "r", stdin);
  79.         freopen("output.txt", "w", stdout);
  80.     #endif
  81.  
  82.     int t, cs = 0;
  83.     scanf("%d", &t);
  84.  
  85.     while(t--){
  86.         printf("Case %d:\n", ++cs);
  87.         int n, q;
  88.         scanf("%d %d", &n, &q);
  89.  
  90.         memset(Tree, 0, sizeof(Tree));
  91.         memset(Lazy, 0, sizeof(Lazy));
  92.         memset(Lazyache, 0, sizeof(Lazyache));
  93.  
  94.         while(q--){
  95.             int type, L, R; scanf("%d %d %d", &type, &L, &R);
  96.             L++, R++;
  97.             if(type == 1){
  98.                 ll val; scanf("%lld", &val);
  99.                 UpdateTree(1, 1, n, L, R, val);
  100.             }
  101.             else{
  102.                 ll sum = Query(1, 1, n, L, R);
  103.                 ll div = R - L + 1;
  104.                 ll gc = __gcd(sum, div);
  105.                 sum/=gc;
  106.                 div/=gc;
  107.                 printf("%lld", sum);
  108.                 if(div > 1) printf("/%lld", div);
  109.                 printf("\n");
  110.             }
  111.         }
  112.     }
  113.  
  114.  
  115.     #ifdef ERFANUL007
  116.         fprintf(stderr, "\n>>> Runtime : %.9f\n", (double) (clock() - tStart) / CLOCKS_PER_SEC);
  117.     #endif
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement