Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define fi freopen("in.txt", "r", stdin)
- #define fo freopen("out.txt", "w", stdout)
- #define m0(a) memset(a , 0 , sizeof(a))
- #define m1(a) memset(a , -1 , sizeof(a))
- #define mx 100009
- using namespace std;
- ll N, i, j ;
- class node
- {
- public:
- ll sum ;
- ll prop ;
- node()
- {
- sum = 0 ;
- prop = -1 ;
- }
- };
- node seg[mx*4] ;
- void pushdown(ll lo, ll hi, ll sp)
- {
- if(seg[sp].prop == -1)
- {
- return ;
- }
- ll mid ;
- mid = (lo+hi) / 2 ;
- ll l, r ;
- l = mid - lo + 1 ;
- r = hi - (mid + 1) + 1 ;
- seg[2*sp+1].prop = seg[sp].prop ;
- seg[2*sp+1].sum = seg[sp].prop * l ;
- seg[2*sp+2].prop = seg[sp].prop ;
- seg[2*sp+2].sum = seg[sp].prop * r ;
- seg[sp].prop = -1 ;
- return ;
- }
- node update(ll lo, ll hi, ll sp, ll x)
- {
- if(lo > j || hi < i )
- {
- return node();
- }
- if(lo >= i && hi <= j)
- {
- ll n ;
- n = (hi - lo + 1) ;
- seg[sp].prop = x ;
- seg[sp].sum = n * x ;
- return seg[sp] ;
- }
- pushdown(lo, hi, sp) ;
- ll mid ;
- mid = (lo+hi) / 2 ;
- update(lo, mid, 2*sp+1, x) ;
- update(mid+1, hi, 2*sp+2, x) ;
- seg[sp].sum = seg[2*sp+1].sum + seg[2*sp+2].sum ;
- return seg[sp] ;
- }
- ll query(ll lo, ll hi, ll sp, ll carry)
- {
- if(lo > j || hi < i)
- {
- return 0 ;
- }
- if(lo >= i && hi <= j)
- {
- return seg[sp].sum ;
- }
- pushdown(lo, hi, sp) ;
- ll mid ;
- mid = (lo+hi) / 2 ;
- ll l, r ;
- l = query(lo, mid, 2*sp+1, seg[sp].prop) ;
- r = query(mid+1, hi, 2*sp+2, seg[sp].prop) ;
- return l+r ;
- }
- ll gcd(ll a, ll b)
- {
- if(a < b)
- {
- swap(a,b) ;
- }
- ll r, d ;
- while(b != 0)
- {
- r = a % b ;
- a = b ;
- b = r ;
- }
- return a ;
- }
- int main()
- {
- // fi ;
- // fo ;
- ll T ;
- scanf("%lld",&T);
- ll t = 0 ;
- ll q, c ;
- while(T--)
- {
- for(ll k = 0 ; k < mx*4 ; k++)
- {
- seg[k] = node() ;
- }
- t++ ;
- scanf("%lld %lld",&N, &q) ;
- printf("Case %lld:\n",t) ;
- while(q--)
- {
- scanf("%lld",&c) ;
- if(c==2)
- {
- scanf("%lld %lld",&i, &j) ;
- ll ans, n ;
- n = j - i + 1 ;
- ans = query(0, N-1, 0, 0) ;
- // cout << ans << endl ;
- if(ans % n == 0)
- {
- printf("%lld\n",ans / n) ;
- }
- else
- {
- printf("%lld/%lld\n",ans / gcd(ans, n), n / gcd(ans, n)) ;
- }
- }
- else if(c==1)
- {
- ll v ;
- scanf("%lld %lld %lld", &i, &j, &v) ;
- update(0, N-1, 0, v) ;
- }
- }
- }
- return 0 ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement