提交时间:2025-05-11 19:38:51
运行 ID: 37847
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=5e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q,c[maxn],len; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} struct BIT { int lb(int x){return x&(-x);} }T,T2; int s[maxn]; int t[maxn]; struct Block { int s[maxn],c[maxn],bel[maxn]; int lz1[maxn],lz2[maxn],lz3[maxn]; void pd(int u){ int L=(u-1)*len+1,R=min(u*len,n); up(i,L,R)c[i]=add(c[i],lz1[u]),s[i]=add(s[i],c[i]*1ll*lz2[u]%mod),s[i]=add(s[i],lz3[u]); lz1[u]=lz2[u]=lz3[u]=0; } void upd1(int l,int r,int x){ if(bel[l]==bel[r]){ pd(bel[l]); up(i,l,r)c[i]=add(c[i],x); return; } upd1(l,bel[l]*len,x),upd1((bel[r]-1)*len+1,r,x); up(i,bel[l]+1,bel[r]-1)lz3[i]=add(lz3[i],mod-lz2[i]*1ll*x%mod),lz1[i]=add(lz1[i],x); } void upd2(int l,int r,int x){ if(bel[l]==bel[r]){ pd(bel[l]); up(i,l,r)s[i]=add(s[i],c[i]*1ll*x%mod); return; } upd2(l,bel[l]*len,x),upd2((bel[r]-1)*len+1,r,x); up(i,bel[l]+1,bel[r]-1)lz2[i]=add(lz2[i],x); } int ask(int x){return add(add(s[x],add(c[x],lz1[bel[x]])*1ll*lz2[bel[x]]%mod),lz3[bel[x]]);} }B; int ask(int x){ if(!x)return 0; int res=0; for(x+=T.lb(x);x<=n;x+=T.lb(x)){ //res=add(res,s[x]); res=add(res,B.ask(x)); } return res; } int Ask(int x){ int res=0; for(;x;x-=T.lb(x))res=add(res,ask(x)*1ll*T.lb(x)%mod); return res; } struct SegTree { struct nd { int slb,sc,ss,lzc,lzs,lzg; void push(int c,int s,int g=0){ ss=add(ss,g*1ll*slb%mod);lzg=add(lzg,g); ss=add(ss,s*1ll*sc%mod); lzg=add(lzg,s*1ll*lzc%mod); sc=add(sc,c*1ll*slb%mod); lzc=add(lzc,c); lzs=add(lzs,s); } }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) void pu(int p){ d[p].slb=add(d[ls(p)].slb,d[rs(p)].slb); d[p].sc=add(d[ls(p)].sc,d[rs(p)].sc); d[p].ss=add(d[ls(p)].ss,d[rs(p)].ss); } void pd(int p){d[ls(p)].push(d[p].lzc,d[p].lzs,d[p].lzg),d[rs(p)].push(d[p].lzc,d[p].lzs,d[p].lzg);d[p].lzc=d[p].lzs=d[p].lzg=0;} void bd(int l,int r,int p){ if(l==r){ d[p].slb=d[p].sc=T.lb(l); return; }int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p));pu(p); } void modify(int l,int r,int s,int t,int p,int C,int S){ if(l<=s&&t<=r)return d[p].push(C,S),void();pd(p); int mid=s+t>>1; if(l<=mid)modify(l,r,s,mid,ls(p),C,S);if(r>mid)modify(l,r,mid+1,t,rs(p),C,S);pu(p); } int ask(int l,int r,int s,int t,int p){ if(l<=s&&t<=r)return d[p].ss;pd(p); int mid=s+t>>1,res=0; if(l<=mid)res=add(res,ask(l,r,s,mid,ls(p)));if(r>mid)res=add(res,ask(l,r,mid+1,t,rs(p))); return res; } }T3; void slv(){ n=read(),q=read(); len=400;up(i,1,n)B.bel[i]=(i-1)/len+1; up(i,1,n)c[i]=1; B.upd1(1,n,1); T3.bd(1,n,1); while(q--){ int op=read(),l=read(),r=read(); if(op==1){ int v=read(); B.upd1(l,r,v); T3.modify(l,r,1,n,1,v,0); //up(i,l,r)c[i]=add(c[i],v); }else if(op==2){ int s1=add(Ask(r),mod-Ask(l-1)); //int s2=add(T2.ask(r),mod-T2.ask(l-1)); int s2=T3.ask(l,r,1,n,1); printf("%d\n",add(s1,s2)); }else { int vv=read(); B.upd2(l,r,vv); T3.modify(l,r,1,n,1,0,vv); } } } int main(){ //freopen("bit.in","r",stdin),freopen("bit.out","w",stdout); slv(); return 0; }