Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- T k=1;char gc;x=0;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c))x=x*10+c-'0',gc;x*=k;
- }
- const int N=1e5+7;
- const int p=998244353;
- const ll Inv=(p+1)>>1;
- int Pow[N];
- int sum=0,prod=1;
- inline int add(int a,int b){
- return (a+=b)>=p?a-p:a;
- }
- inline int sub(int a,int b){
- return (a-=b)<0?a+p:a;
- }
- int f[N<<2],g[N<<2],tag[N<<2];
- #define ls (rt<<1)
- #define rs (rt<<1|1)
- inline void pushdown(int rt){
- if(tag[rt]){
- g[ls]=add((ll)g[ls]*Pow[tag[rt]]%p,sub(1,Pow[tag[rt]]));
- g[rs]=add((ll)g[rs]*Pow[tag[rt]]%p,sub(1,Pow[tag[rt]]));
- tag[ls]+=tag[rt];
- tag[rs]+=tag[rt];
- tag[rt]=0;
- }
- }
- void modify(int rt,int l,int r,int x,int y){
- sum=sub(sum,f[rt]);
- f[rt]=f[rt]*Inv%p;
- g[rt]=g[rt]*Inv%p;
- if(x<=l&&r<=y){
- f[rt]=add(f[rt],Inv);
- g[rt]=add(g[rt],Inv);
- }
- else if(l>y||r<x){
- f[rt]=add(f[rt],g[rt]);
- g[rt]=add(g[rt],g[rt]);
- }
- sum=add(sum,f[rt]);
- if(l>y||r<x)return ;
- if(x<=l&&r<=y){
- ++tag[rt];
- return ;
- }
- pushdown(rt);
- int mid=(l+r)>>1;
- modify(ls,l,mid,x,y);
- modify(rs,mid+1,r,x,y);
- }
- int main(){
- int n,m;r(n),r(m);
- Pow[0]=1;
- for(int i=1;i<=m;++i){
- Pow[i]=Pow[i-1]*Inv%p;
- }
- while(m--){
- int opt,l,r;r(opt);
- if(opt==1){
- r(l),r(r);
- modify(1,1,n,l,r);
- prod=add(prod,prod);
- }
- else{
- printf("%lld\n",(ll)sum*prod%p);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement