#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int n,m;
int a[N],b[N];
struct Tree
{
int A,B;
int l,r;
int maxn;
}tree[N<<2];
int op,x,y;
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void push_up(int p)
{
tree[p].A=max(tree[ls(p)].A,tree[rs(p)].A);
tree[p].B=min(tree[ls(p)].B,tree[rs(p)].B);
tree[p].l=max(tree[ls(p)].l,max(tree[rs(p)].l,tree[ls(p)].A-tree[rs(p)].B));
tree[p].r=max(tree[ls(p)].r,max(tree[rs(p)].r,tree[rs(p)].A-tree[ls(p)].B));
tree[p].maxn=max(max(tree[ls(p)].maxn,tree[rs(p)].maxn),max(tree[ls(p)].l+tree[rs(p)].A,tree[rs(p)].r+tree[ls(p)].A));
}
void build(int s,int t,int p)
{
if(s==t)
{
tree[p].A=a[s];
tree[p].B=b[s];
tree[p].maxn=tree[p].l=tree[p].r=LLONG_MIN;
return;
}
int mid=s+(t-s>>1);
build(s,mid,ls(p));
build(mid+1,t,rs(p));
push_up(p);
}
void update1(int l,int k,int s,int t,int p)
{
if(s==t)
{
tree[p].A=k;
return;
}
int mid=s+(t-s>>1);
if(l<=mid) update1(l,k,s,mid,ls(p));
else update1(l,k,mid+1,t,rs(p));
push_up(p);
}
void update2(int l,int k,int s,int t,int p)
{
if(s==t)
{
tree[p].B=k;
return;
}
int mid=s+(t-s>>1);
if(l<=mid) update2(l,k,s,mid,ls(p));
else update2(l,k,mid+1,t,rs(p));
push_up(p);
}
Tree query(int l,int r,int s,int t,int p)
{
if(l<=s and t<=r) return tree[p];
int mid=s+(t-s>>1);
Tree trl={0,0,0,0,0},trr={0,0,0,0,0},ans;
trl.B=trr.B=LLONG_MAX;
if(l<=mid)
trl=query(l,r,s,mid,ls(p));
if(mid+1<=r)
trr=query(l,r,mid+1,t,rs(p));
ans.A=max(trl.A,trr.A);
ans.B=min(trl.B,trr.B);
ans.l=max(trl.l,max(trr.l,trl.A-trr.B));
ans.r=max(trl.r,max(trr.r,trr.A-trl.B));
ans.maxn=max(max(trl.maxn,trr.maxn),max(trl.l+trr.A,trr.r+trl.A));
return ans;
}
signed main()
{
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,n,1);
while(m--)
{
cin>>op>>x>>y;
if(op==1) update1(x,y,1,n,1);
else if(op==2) update2(x,y,1,n,1);
else cout<<query(x,y,1,n,1).maxn<<'\n';
}
return 0;
}