#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,inf=0x3f3f3f3f3f3f3f3f;
int a[N],b[N];
struct node{
int sum,ij,jk,mx,mi;
}tr[N<<2];
node pushup(node ls,node rs)
{
node res;
res.sum=max({ls.sum,rs.sum,ls.ij+rs.mx,ls.mx+rs.jk});
res.mi=min(ls.mi,rs.mi);
res.mx=max(ls.mx,rs.mx);
res.ij=max(ls.ij,ls.mx-rs.mi);
res.jk=max(rs.jk,rs.mx-ls.mi);
return res;
}
void build(int p,int pl,int pr)
{
if(pl==pr)
{
tr[p].mx=a[pl];
tr[p].mi=b[pl];
tr[p].sum=-inf;
tr[p].ij=tr[p].jk=-inf;
return ;
}
int mid=(pl+pr)>>1;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
tr[p]=pushup(tr[p<<1],tr[p<<1|1]);
}
void updateA(int p,int pl,int pr,int x,int d)
{
if(pl==pr)
{
tr[p].mx=d;
return ;
}
int mid=(pl+pr)>>1;
if(x<=mid)
updateA(p<<1,pl,mid,x,d);
else
updateA(p<<1|1,mid+1,pr,x,d);
tr[p]=pushup(tr[p<<1],tr[p<<1|1]);
}
void updateB(int p,int pl,int pr,int x,int d)
{
if(pl==pr)
{
tr[p].mi=d;
return ;
}
int mid=(pl+pr)>>1;
if(x<=mid)
updateB(p<<1,pl,mid,x,d);
else
updateB(p<<1|1,mid+1,pr,x,d);
tr[p]=pushup(tr[p<<1],tr[p<<1|1]);
}
node query(int p,int pl,int pr,int L,int R)
{
if(L<=pl&&pr<=R)
return tr[p];
int mid=(pl+pr)>>1;
if(R<=mid)
return query(p<<1,pl,mid,L,R);
if(L>mid)
return query(p<<1|1,mid+1,pr,L,R);
return pushup(query(p<<1,pl,mid,L,R),query(p<<1|1,mid+1,pr,L,R));
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
build(1,1,n);
while(m--)
{
int op,l,r;
cin>>op>>l>>r;
if(op==1)
updateA(1,1,n,l,r);
else if(op==2)
updateB(1,1,n,l,r);
else
cout<<query(1,1,n,l,r).sum<<'\n';
}
}