#include<iostream>
#include<string.h>
#include<cstdio>
#define mid (l+r)>>1
#define lc u<<1
#define rc u<<1|1
using namespace std;
const long long inf=5e5+16;
int A[inf],B[inf];
struct tree{
int maxA,minB;
int maxab,maxbc,ans;
}z[inf<<2];
inline int read(){
int s=0,w=1;
char c=getchar();
while(!isdigit(c)){
if (c=='-')
w=-1;
c=getchar();
}
while (isdigit(c)){
s=s*10+(c^48);
c=getchar();
}
return s*w;
}
inline void write(int x){
if (x<0) x=-x,putchar('-');
if (x>9) write(x/10);
putchar(x%10+'0');
}
tree pushup(tree l,tree r){
tree k;
k.maxA=max(l.maxA,r.maxA);
k.minB=min(l.minB,r.minB);
k.maxab=max(max(l.maxab,r.maxab),l.maxA-r.minB);
k.maxbc=max(max(l.maxbc,r.maxbc),r.maxA-l.minB);
k.ans=max(max(l.ans,r.ans),max(l.maxab+r.maxA,r.maxbc+l.maxA));
return k;
}
void build (int u,int l,int r){
if (l==r){
z[u]={A[l],B[l],-inf,-inf,-inf};
return;
}
build(lc,l,mid);
build(rc,mid+1,r);
z[u]=pushup(z[lc],z[rc]);
}
void modify(int u,int x,int l,int r,int x1,int x2){
if (l==r){
z[u]={x1,x2,-inf,-inf,-inf};
return;
}
if (x<=mid) modify(lc,x,l,mid,x1,x2);
else modify(rc,x,mid+1,r,x1,x2);
z[u]=pushup(z[lc],z[rc]);
}
tree query(int u,int l,int r,int x,int y){
if (l>=x&&r<=y) return z[u];
if (y<=mid) return query(lc,l,mid,x,y);
else if (x>=mid) return query(rc,mid+1,r,x,y);
else return pushup(query(lc,l,mid,x,y),query(rc,mid+1,r,x,y));
}
int main(){
int m,n,a,b,c;
cin>>m>>n;
for (int i=1;i<=n;i++) A[i]=read();
for (int i=1;i<=n;i++) B[i]=read();
build(1,1,n);
for (int i=0;i<m;i++){
a=read();
b=read();
c=read();
if (a==1) modify(1,1,n,b,c,B[b]);
else if (a==2) modify(1,1,n,b,A[b],c);
else{
write(query(1,1,n,b,c).ans);
puts("");
}
}
return 0;
}