#include<bits/stdc++.h>
#define ll long long
#define F(i,a,b) for(ll i=a;i<=b;i++)
#define R(i,a,b) for(ll i=a;i>=b;i--)
#define sc(a) scanf("%lld",&a)
#define ps(a) printf("%lld ",a)
#define pn(a) printf("%lld\n",a)
using namespace std;
const ll N=2e5+7;
ll n,q,a[N],id[N],li[N],ri[N],b[N],sum[N],sma[N],smb[N],lk[N],rk[N],adda[N],addb[N];
const ll mod=998244353;
int main(){
sc(n),sc(q);
ll sz=sqrt(n);
for(ll i=1;i<=n;i++) sc(a[i]),a[i]%=mod;
for(ll i=1;i<=n;i++) sc(b[i]),b[i]%=mod;
for(ll i=1;i<=n;i++){
id[i]=(i-1)/sz+1;
lk[i]=(id[i]-1)*sz+1;
rk[i]=min(n,id[i]*sz);
sum[id[i]]+=a[i]*b[i];
sum[id[i]]%=mod;
sma[id[i]]+=a[i];
sma[i]%=mod;
smb[id[i]]+=b[i];
smb[i]%=mod;
}
ll cnt=(n/sz)+(n%sz!=0);
for(ll i=1;i<=cnt;i++){
li[i]=ri[i-1]+1;
ri[i]=min(n,ri[i-1]+sz);
}
while(q--){
ll opt,l,r,k;
sc(opt),sc(l),sc(r);
if(opt==1){
sc(k);
if(id[l]==id[r]){
for(ll i=l;i<=r;i++){
sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
a[i]+=k;
sma[id[i]]+=k;
sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
a[i]%=mod;
sum[id[i]]%=mod;
sum[id[i]]+=mod;
sum[id[i]]%=mod;
sma[id[i]]%=mod;
}
continue;
}
for(ll i=id[l]+1;i<=id[r]-1;i++){
sum[i]+=k*smb[i];
sma[i]+=(ri[i]-li[i]+1)*k;
adda[i]+=k;
sma[i]%=mod;
sum[i]%=mod;
adda[i]%=mod;
}
for(ll i=l;i<=rk[l];i++){
sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
a[i]+=k;
sma[id[i]]+=k;
sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
a[i]%=mod;
sum[id[i]]%=mod;
sum[id[i]]+=mod;
sum[id[i]]%=mod;
sma[id[i]]%=mod;
}
for(ll i=lk[r];i<=r;i++){
sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
a[i]+=k;
sma[id[i]]+=k;
sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
a[i]%=mod;
sum[id[i]]%=mod;
sum[id[i]]+=mod;
sum[id[i]]%=mod;
sma[id[i]]%=mod;
}
}
else if(opt==2){
sc(k);
if(id[l]==id[r]){
for(ll i=l;i<=r;i++){
sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
b[i]+=k;
smb[id[i]]+=k;
sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
b[i]%=mod;
sum[id[i]]%=mod;
sum[id[i]]+=mod;
sum[id[i]]%=mod;
smb[id[i]]%=mod;
}
continue;
}
for(ll i=id[l]+1;i<=id[r]-1;i++){
sum[i]+=k*sma[i];
smb[i]+=(ri[i]-li[i]+1)*k;
addb[i]+=k;
smb[i]%=mod;
sum[i]%=mod;
addb[i]%=mod;
}
for(ll i=l;i<=rk[l];i++){
sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
b[i]+=k;
smb[id[i]]+=k;
sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
b[i]%=mod;
sum[id[i]]%=mod;
sum[id[i]]+=mod;
sum[id[i]]%=mod;
smb[id[i]]%=mod;
}
for(ll i=lk[r];i<=r;i++){
sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
b[i]+=k;
smb[id[i]]+=k;
sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
b[i]%=mod;
sum[id[i]]%=mod;
sum[id[i]]+=mod;
sum[id[i]]%=mod;
smb[id[i]]%=mod;
}
}
else{
ll ans=0;
if(id[l]==id[r]){
for(ll i=l;i<=r;i++){
ans+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
ans%=mod;
}
pn(ans);
continue;
}
for(ll i=id[l]+1;i<=id[r]-1;i++){
ans+=sum[i];
ans%=mod;
}
for(ll i=l;i<=rk[l];i++){
ans+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
ans%=mod;
}
for(ll i=lk[r];i<=r;i++){
ans+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
ans%=mod;
}
pn(ans);
}
}
return 0;
}
/*
5 6
1 1 1 1 1
1 1 1 1 1
1 1 3 1
3 1 3
1 2 4 1
3 1 4
1 5 5 1
3 1 5
*/
一眼看出来,写的分块,但是挑了一晚上/kel