提交时间:2025-05-11 19:37:59

运行 ID: 37846

#include<bits/stdc++.h> #define ll long long #define lbt(x) ((x)&(-(x))) #define ls (p<<1) #define rs ((p<<1)|1) using namespace std; const int N = (1<<19)+5,md = 998244353; inline int read(){ int s = 0;char ch = getchar(); while(!isdigit(ch))ch = getchar(); while(isdigit(ch)){s = (s<<1)+(s<<3)+ch-'0';ch = getchar();} return s; } char pst[100] = {' ','\n'}; int tp; void wrt(int x){ tp = 1; do{ pst[++tp] = x%10+'0'; }while(x/=10); while(tp)putchar(pst[tp--]); } int n,m; struct TAG{ TAG(){} TAG(bool opk,int v){ emp = 0; if(opk){//1 dbb2 = dkc = v; dkr = dcr = dbs = db2s = dls = 0; }else{//3 dcr = db2s = v; dbb2 = dkc = dkr = dbs = dls = 0; } } bool emp; int dbb2,dkc,dkr,dcr,dbs,db2s,dls; TAG operator*(const TAG& an)const{//this�ǵ�ǰ�ڵ��tag if(emp)return an; TAG res; res.emp = false; res.dbb2 = (dbb2+an.dbb2)%md; res.dkc = (dkc+an.dkc)%md; res.dkr = (int)(((ll)dkc*an.dcr+dkr+an.dkr)%md); res.dcr = (dcr+an.dcr)%md; res.dbs = (int)((dbs+an.dbs+(ll)dbb2*an.db2s)%md); res.db2s = (db2s+an.db2s)%md; res.dls = (dls+an.dls)%md; return res; } void clear(bool opr = false){ dbb2 = dkc = dkr = dcr = dbs = db2s = dls = 0; emp = opr; } void prt()const{ printf("%d %d %d %d %d %d %d %d\n",(int)emp,dbb2,dkc,dkr,dcr,dbs,db2s,dls); } }now; struct T{ int l,r,mid; bool kd; ll sum,len,ran,bs,bs2,c; TAG tg; void mt(const TAG& an){ tg = tg*an; sum = (sum+an.dls*len+an.dbs*bs+an.db2s*bs2)%md; bs2 = (bs2+bs*an.dbb2)%md; if(kd){ ran = (ran+an.dkr+an.dcr*c)%md; c = (c+an.dkc)%md; } } void add(ll v){ if(tg.emp)tg.clear(); (tg.dls+=v)%=md; (sum+=v*len)%=md; } void prt()const{ printf("%d %d %lld %lld ",l,r,sum,ran); tg.prt(); } }t[4*N]; void build(int p,int l,int r){ t[p].l = l;t[p].r = r; t[p].mid = (l+r)>>1; t[p].tg.clear(true); t[p].len = (r-l+1); t[p].c = t[p].kd = (p==1||lbt(p)>1); t[p].sum = t[p].ran = 0; t[p].bs = t[p].bs2 = t[p].kd?t[p].len:0; if(l==r)return; build(ls,l,t[p].mid); build(rs,t[p].mid+1,r); t[p].bs+=t[ls].bs+t[rs].bs; t[p].bs2 = t[p].bs;//bs��Ԥ���� } inline void ud(int p){ t[p].sum = (t[ls].sum+t[rs].sum)%md; t[p].bs2 = (t[p].len*t[p].c+t[ls].bs2+t[rs].bs2)%md;//Ҫ+��ǰ�ڵ�Ĺ��� } inline void tag(int p){ if(!t[p].tg.emp){ t[ls].mt(t[p].tg); t[rs].mt(t[p].tg); t[p].tg.emp = 1; } if(t[p].ran){ t[ls].add(t[p].ran); t[rs].add(t[p].ran); t[p].ran = 0; } } void mdf(int p,int r){ if(t[p].r<=r){ t[p].mt(now); // t[p].prt(); return; } tag(p); mdf(ls,r); if(t[p].mid<r)mdf(rs,r); ud(p); // t[p].prt(); } ll qr(int p,int l,int r){ if(l<=t[p].l&&t[p].r<=r)return t[p].sum; tag(p);ll res = 0; if(t[p].mid>=l)res = qr(ls,l,r); if(t[p].mid<r)res+=qr(rs,l,r); return res; } int main(){ //freopen("bit.in","r",stdin); //freopen("bit.out","w",stdout); n = read();m = read(); while(n^lbt(n))n+=lbt(n); build(1,1,n); int op,l,r,v; bool nkd; while(m--){ op = read();l = read();r = read(); if(op==2){ // printf("%lld\n",(qr(1,l,r)%md+md)%md); wrt((qr(1,l,r)%md+md)%md); }else{ v = read()%md;nkd = op==1; now = TAG(nkd,v); mdf(1,r); if(l!=1){ now = TAG(nkd,-v); mdf(1,l-1); } } } return 0; }