Advertisement
yicongli

LG5280

Apr 2nd, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     T k=1;char gc;x=0;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c))x=x*10+c-'0',gc;x*=k;
  14. }
  15.  
  16. const int N=1e5+7;
  17. const int p=998244353;
  18. const ll Inv=(p+1)>>1;
  19.  
  20. int Pow[N];
  21. int sum=0,prod=1;
  22.  
  23. inline int add(int a,int b){
  24.     return (a+=b)>=p?a-p:a;
  25. }
  26.  
  27. inline int sub(int a,int b){
  28.     return (a-=b)<0?a+p:a;
  29. }
  30.  
  31. int f[N<<2],g[N<<2],tag[N<<2];
  32.  
  33. #define ls (rt<<1)
  34. #define rs (rt<<1|1)
  35.  
  36. inline void pushdown(int rt){
  37.     if(tag[rt]){
  38.         g[ls]=add((ll)g[ls]*Pow[tag[rt]]%p,sub(1,Pow[tag[rt]]));
  39.         g[rs]=add((ll)g[rs]*Pow[tag[rt]]%p,sub(1,Pow[tag[rt]]));
  40.         tag[ls]+=tag[rt];
  41.         tag[rs]+=tag[rt];
  42.         tag[rt]=0;
  43.     }
  44. }
  45.  
  46. void modify(int rt,int l,int r,int x,int y){
  47.     sum=sub(sum,f[rt]);
  48.     f[rt]=f[rt]*Inv%p;
  49.     g[rt]=g[rt]*Inv%p;
  50.     if(x<=l&&r<=y){
  51.         f[rt]=add(f[rt],Inv);
  52.         g[rt]=add(g[rt],Inv);
  53.     }
  54.     else if(l>y||r<x){
  55.         f[rt]=add(f[rt],g[rt]);
  56.         g[rt]=add(g[rt],g[rt]);
  57.     }
  58.     sum=add(sum,f[rt]);
  59.     if(l>y||r<x)return ;
  60.     if(x<=l&&r<=y){
  61.         ++tag[rt];
  62.         return ;
  63.     }
  64.     pushdown(rt);
  65.     int mid=(l+r)>>1;
  66.     modify(ls,l,mid,x,y);
  67.     modify(rs,mid+1,r,x,y);
  68. }
  69.  
  70. int main(){
  71.     int n,m;r(n),r(m);
  72.     Pow[0]=1;
  73.     for(int i=1;i<=m;++i){
  74.         Pow[i]=Pow[i-1]*Inv%p;
  75.     }
  76.     while(m--){
  77.         int opt,l,r;r(opt);
  78.         if(opt==1){
  79.             r(l),r(r);
  80.             modify(1,1,n,l,r);
  81.             prod=add(prod,prod);
  82.         }
  83.         else{
  84.             printf("%lld\n",(ll)sum*prod%p);
  85.         }
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement