#include <iostream>
#define int long long
using namespace std;
const int mod=998244353;
const int N=2e5+5;
int a[N],b[N];
struct sg{
int taga,tagb;
int suma,sumb;
int facj;
}d[4*N];
void pushdown(int x,int l,int r){
if(l!=r){
int mid=(l+r)/2;
d[x*2].facj+=d[x].taga*d[x*2].sumb;
d[x*2+1].facj+=d[x].taga*d[x*2+1].sumb;
d[x*2].facj+=d[x].tagb*d[x*2].suma;
d[x*2+1].facj+=d[x].tagb*d[x*2+1].suma;
d[x*2].suma+=d[x].taga*(mid-l+1);
d[x*2+1].suma+=d[x].taga*(r-mid);
d[x*2].sumb+=d[x].tagb*(mid-l+1);
d[x*2+1].sumb+=d[x].tagb*(r-mid);
d[x*2].taga+=d[x].taga;
d[x*2+1].taga+=d[x].taga;
d[x*2].tagb+=d[x].tagb;
d[x*2+1].tagb+=d[x].tagb;
d[x].taga=0;
d[x].tagb=0;
}
}
void build(int x,int l,int r){
if(l==r){
d[x].suma=a[l];
d[x].sumb=b[l];
d[x].facj+=d[x].suma*d[x].sumb;
d[x].facj%=mod;
return ;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
d[x].suma=d[x*2].suma+d[x*2+1].suma;
d[x].sumb=d[x*2+1].sumb+d[x*2+1].sumb;
d[x].facj=d[x*2].facj+d[x*2+1].facj;
}
void modify1(int x,int l,int r,int a,int b,int k){
pushdown(x,l,r);
if(l==a&&r==b){
d[x].facj+=d[x].suma*k;
d[x].facj%=mod;
d[x].sumb+=(r-l+1)*k;
d[x].sumb%=mod;
return ;
}
int mid=(l+r)/2;
if(b<=mid){
modify1(x*2,l,mid,a,b,k);
}
else{
if(a>=mid+1){
modify1(x*2+1,mid+1,r,a,b,k);
}
else{
modify1(x*2,l,mid,a,mid,k);
modify1(x*2+1,mid+1,r,mid+1,b,k);
}
}
d[x].facj=d[x*2].facj+d[x*2+1].facj;
}
void modify2(int x,int l,int r,int a,int b,int k){
pushdown(x,l,r);
if(l==a&&r==b){
d[x].facj+=d[x].sumb*k;
d[x].facj%=mod;
d[x].suma+=(r-l+1)*k;
d[x].suma%=mod;
return ;
}
int mid=(l+r)/2;
if(b<=mid){
modify2(x*2,l,mid,a,b,k);
}
else{
if(a>=mid+1){
modify2(x*2+1,mid+1,r,a,b,k);
}
else{
modify2(x*2,l,mid,a,mid,k);
modify2(x*2+1,mid+1,r,mid+1,b,k);
}
}
d[x].facj=d[x*2].facj+d[x*2+1].facj;
}
int find(int x,int l,int r,int a,int b){
pushdown(x,l,r);
if(l==a&&r==b){
return d[x].facj;
}
int mid=(l+r)/2;
if(b<=mid){
return find(x*2,l,mid,a,b);
}
else{
if(a>=mid+1){
return find(x*2+1,mid+1,r,a,b);
}
else{
return find(x*2,l,mid,a,mid)+find(x*2+1,mid+1,r,mid+1,b);
}
}
}
signed main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
build(1,1,n);
for(int i=1;i<=q;i++){
int opt;
cin>>opt;
if(opt==1){
int l,r,x;
cin>>l>>r>>x;
modify2(1,1,n,l,r,x);
}
else{
if(opt==2){
int l,r,x;
cin>>l>>r>>x;
modify1(1,1,n,l,r,x);
}
else{
int l,r;
cin>>l>>r;
cout<<find(1,1,n,l,r)<<"\n";
}
}
}
return 0;
}