#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,INF=1e9;
int n,m;
int a[N],b[N];
struct node
{
int maxA,minB,ab,ba,ans;
}tree[N<<2];
inline int read()
{
int a=0,f=1;
char c=getchar();
while(!isdigit(c)) f=-1,c=getchar();
while(isdigit(c)) a=(a<<3)+(a<<1)+(c^'0'),c=getchar();
return a*f;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
putchar(x%10+'0');
}
node pushup(node lc,node rc)
{
node rt;
rt.maxA=max(lc.maxA,rc.maxA);
rt.minB=min(lc.minB,rc.minB);
rt.ab=max(max(lc.ab,rc.ab),(lc.maxA-rc.minB));
rt.ba=max(max(lc.ba,rc.ba),(rc.maxA-lc.minB));
rt.ans=max(max(lc.ans,rc.ans),max(lc.ab+rc.maxA,lc.maxA+rc.ba));
return rt;
}
void build(int u,int l,int r)
{
if(l==r)
{
tree[u]={a[l],b[l],-INF,-INF,-INF};
return;
}
int mid= l+r >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid+1,r);
tree[u]=pushup(tree[u<<1],tree[u<<1 | 1]);
}
node query(int u,int l,int r,int fl,int fr)
{
if(fl<=l && r<=fr) return tree[u];
int mid=l+r >>1;
if(fr<=mid) return query(u << 1,l,mid,fl,fr);
else if(fl>mid) return query(u << 1 | 1,mid+1,r,fl,fr);
else return pushup(query(u<<1,l,mid,fl,fr),query(u<<1 | 1,mid+1,r,fl,fr));
}
void modify(int u,int l,int r,int x,int val1,int val2)
{
if(l==r)
{
tree[u]={val1,val2,-INF,-INF,-INF};
return;
}
int mid=l+r >> 1;
if(x<=mid) modify(u<<1,l,mid,x,val1,val2);
else modify(u<<1 | 1,mid+1,r,x,val1,val2);
tree[u]=pushup(tree[u<<1],tree[u<<1 | 1]);
}
int 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();
build(1,1,n);
int opt,x,y;
while(m--)
{
opt=read(),x=read(),y=read();
if(opt==1) a[x]=y,modify(1,1,n,x,a[x],b[x]);
else if(opt==2) b[x]=y,modify(1,1,n,x,a[x],b[x]);
else write(query(1,1,n,x,y).ans),printf("\n");
}
return 0;
}