rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
struct node {
int l,r,sm,mn;
} tr[4*N];
int n,m;
int a[N],b[N];
void upd(int pos) {
tr[pos].sm=tr[pos*2].sm+tr[pos*2+1].sm;
tr[pos].mn=min(tr[pos*2].mn,tr[pos*2+1].mn);
}
void build(int pos,int l,int r) {
tr[pos].l=l;
tr[pos].r=r;
if(l==r) {
tr[pos].sm=a[l]+b[l];
tr[pos].mn=a[l]*b[l];
return;
}
int mid=(l+r)/2;
build(pos*2,l,mid);build(pos*2+1,mid+1,r);
tr[pos].sm=tr[pos*2].sm+tr[pos*2+1].sm;
tr[pos].mn=min(tr[pos*2].mn,tr[pos*2+1].mn);
upd(pos);
}
void spl(int pos,int l,int r,int lim,int val) {
if(tr[pos].r<l||tr[pos].l>r) return;
if(tr[pos].mn>lim) return;
else {
if(tr[pos].l==tr[pos].r) {
tr[pos].sm+=2*val;
a[l]+=val,b[l]+=val;
tr[pos].mn=a[l]*b[l];
return;
}
spl(pos*2,l,r,lim,val);
spl(pos*2+1,l,r,lim,val);
upd(pos);
}
}
void sst(int pos,int gol,int aval,int bval) {
if(tr[pos].r<gol||tr[pos].l>gol) return;
if(tr[pos].l==tr[pos].r) {
tr[pos].sm=aval+bval;
a[gol]=aval,b[gol]=bval;
tr[pos].mn=aval*bval;
return;
}
sst(pos*2,gol,aval,bval);
sst(pos*2+1,gol,aval,bval);
upd(pos);
}
int ssc(int pos,int l,int r) {
if(tr[pos].r<l||tr[pos].l>r) return 0;
if(tr[pos].l>=l&&tr[pos].r<=r) return tr[pos].sm;
int res=0;
res+=ssc(pos*2,l,r)+ssc(pos*2+1,l,r);
return res;
}
int x,y,k,t,opt;
signed main() {
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
build(1,1,n);
for(int i=1;i<=m;i++) {
scanf("%lld",&opt);
if(opt==1) {
scanf("%lld %lld %lld %lld",&x,&y,&k,&t);
spl(1,x,y,k,t);
}
if(opt==2) {
scanf("%lld %lld %lld",&k,&x,&y);
sst(1,k,x,y);
}
if(opt==3) {
scanf("%lld %lld",&x,&y);
printf("%lld\n",ssc(1,x,y));
}
}
}