#include<bits/stdc++.h>
using namespace std;
#define sit set<Node>::iterator
const int MAXN=1e5+10;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}return x*f;}
struct Node{
int l,r;
mutable int val,vala,valb;
bool operator <(const Node& a)const{
return l<a.l;
}
};
set<Node> odtp,odtm;
int n,m,from,a[MAXN],b[MAXN],pl[MAXN],mul[MAXN];
sit splitp(int pos){
sit it=odtp.lower_bound({pos,0,0,0,0});
if (it!=odtp.end()&&it->l==pos) return it;
--it;
int l=it->l,r=it->r;
int val=it->val,vala=it->vala,valb=it->valb;
odtp.erase(it);
odtp.insert({l,pos-1,val,vala,valb});
return odtp.insert({pos,r,val,vala,valb}).first;
}
sit splitm(int pos){
sit it=odtm.lower_bound({pos,0,0,0,0});
if (it!=odtm.end()&&it->l==pos) return it;
--it;
int l=it->l,r=it->r;
int val=it->val,vala=it->vala,valb=it->valb;
odtm.erase(it);
odtm.insert({l,pos-1,val,vala,valb});
return odtm.insert({pos,r,val,vala,valb}).first;
}
void assignp(int l,int r,int val,int vala,int valb){
sit it2=splitp(r+1),it1=splitp(l);
odtp.erase(it1,it2);
odtp.insert({l,r,val,vala,valb});
return;
}
void assignm(int l,int r,int val,int vala,int valb){
sit it2=splitm(r+1),it1=splitm(l);
odtm.erase(it1,it2);
odtm.insert({l,r,val,vala,valb});
return;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=read(),pl[i]=a[i]+b[i],mul[i]=a[i]*b[i];
for(int i=1;i<=n+1;i++) if(pl[i]!=pl[i-1]){
if(from==0) from=i;
else odtp.insert({from,i-1,pl[i-1],a[i-1],b[i-1]}),from=0;
}
for(int i=1;i<=n+1;i++) if(mul[i]!=mul[i-1]){
if(from==0) from=i;
else odtm.insert({from,i-1,mul[i-1],a[i-1],b[i-1]}),from=0;
}
while(m--){
int op=read();
if(op==1){
int l=read(),r=read(),k=read(),t=read();
for(Node i: odtm) if(i.val<=k){
i.val=(i.vala+t)*(i.valb+t);
i.vala+=t,i.valb+=t;
sit lft=splitm(i.l);
lft->val+=2*t;
lft->vala+=t;
lft->valb+=t;
sit rig=splitm(i.r+1);
rig--;
rig->val+=2*t;
rig->vala+=t;
rig->valb+=t;
}
}else if(op==2){
int pos=read(),x=read(),y=read();
assignp(pos,pos,x+y,x,y);
assignm(pos,pos,x*y,x,y);
}else{
int l=read(),r=read(),cnt=0;
sit lft=splitp(l);
sit rig=splitp(r+1);
for(sit i=lft;i!=rig;i++)
cnt+=i->val*(i->r-i->l+1);
cout<<cnt<<'\n';
}
}return 0;
}