#include<bits/stdc++.h>
#include<atcoder/modint>
#define int long long
using namespace std;
const int N=2e5+5,mod=998244353;
struct node{
int sum,sum1,sum2;
int tag1,tag2;
}tr[N<<2];
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
void pushup(int p)
{
tr[p].sum=(tr[ls(p)].sum+tr[rs(p)].sum)%mod;
tr[p].sum1=(tr[ls(p)].sum1+tr[rs(p)].sum1)%mod;
tr[p].sum2=(tr[ls(p)].sum2+tr[rs(p)].sum2)%mod;
}
void addtag(int p,int pl,int pr,int d,int ty)
{
int len=pr-pl+1;d%=mod;
if(ty==1)
{
tr[p].tag1=(tr[p].tag1+d)%mod;
tr[p].sum1=(tr[p].sum1+(len*d)%mod)%mod;
tr[p].sum=(tr[p].sum+(tr[p].sum2*len)%mod*d%mod)%mod;
}
else
{
tr[p].tag2=(tr[p].tag2+d)%mod;
tr[p].sum2=(tr[p].sum2+(len*d)%mod)%mod;
tr[p].sum=(tr[p].sum+(tr[p].sum1*len%mod)*d%mod)%mod;
}
}
void pushdown(int p,int pl,int pr)
{
int mid=pl+pr>>1;
if(tr[p].tag1)
{
addtag(ls(p),pl,mid,tr[p].tag1,1);
addtag(rs(p),mid+1,pr,tr[p].tag1,1);
tr[p].tag1=0;
}
if(tr[p].tag2)
{
addtag(ls(p),pl,mid,tr[p].tag2,2);
addtag(rs(p),mid+1,pr,tr[p].tag2,2);
tr[p].tag2=0;
}
}
void update(int p,int pl,int pr,int L,int R,int d,int t)
{
if(L<=pl&&pr<=R)
{
addtag(p,pl,pr,d,t);
return ;
}
if(R<pl||pr<L)
return ;
int mid=pl+pr>>1;
pushdown(p,pl,pr);
update(ls(p),pl,mid,L,R,d,t);
update(rs(p),mid+1,pr,L,R,d,t);
pushup(p);
}
int query(int p,int pl,int pr,int L,int R)
{
if(L<=pl&&pr<=R)
return tr[p].sum;
if(R<pl||pr<L)
return 0;
int mid=pl+pr>>1;
pushdown(p,pl,pr);
return query(ls(p),pl,mid,L,R)+query(rs(p),mid+1,pr,L,R);
}
signed main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;++i)
{
int x;
cin>>x;
update(1,1,n,i,i,x,1);
}
for(int i=1;i<=n;++i)
{
int x;
cin>>x;
update(1,1,n,i,i,x,2);
}
while(q--)
{
int op,l,r,d;
cin>>op>>l>>r;
if(op<=2)
{
cin>>d;
update(1,1,n,l,r,d,op);
}
else
cout<<query(1,1,n,l,r)<<'\n';
}
}
样例1没过,样例2过了。