#include<bits/stdc++.h>
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l+r)>>1)
#define int long long
#define INF -1e8-10
using namespace std;
constexpr int N = 1000005;
int n , m;
struct S{
int am , bm , lx , rx , mx;
}segt[N << 3];
struct Node{
int a , b;
}a[N];
S pushup(S s1 , S s2){
S tag;
tag.am = max(s1.am , s2.am);
tag.bm = min(s1.bm , s2.bm);
tag.lx = s1.am - s2.bm;
tag.rx = s2.am - s1.bm;
tag.lx = max(tag.lx , max(s1.lx , s2.lx));
tag.rx = max(tag.rx , min(s1.rx , s2.rx));
tag.mx = max(s1.lx + s2.am , s2.rx + s1.bm);
tag.mx = max(tag.mx , max(s1.mx , s2.mx));
return tag;
}
void build(int u , int l , int r){
if(l == r){
segt[u].am = a[1].a;
segt[u].bm = a[1].b;
segt[u].lx = segt[u].rx = segt[u].mx = INF;
return ;
}
build(ls , l , mid);
build(rs , mid + 1 , r);
segt[u] = pushup(segt[ls] , segt[rs]);
}
void update(int u , int l , int r , int pos , int k , int op){
if(l == r){
if(op == 1){
segt[u].lx = k;
}
else{
segt[u].rx = k;
}
return ;
}
if(pos <= mid){
update(ls , l , mid , pos , k , op);
}
if(pos > mid){
update(rs , mid + 1 , r , pos , k , op);
}
segt[u] = pushup(segt[ls] , segt[rs]);
}
S query(int u , int l , int r , int L , int R){
if(L <= l && r <= R){
return segt[u];
}
if(L > mid){
return query(ls , l , mid , L, R);
}
if(R <= mid){
return query(rs , mid + 1 , r , L , R);
}
return pushup(segt[ls] , segt[rs]);
}
signed main(){
scanf("%lld%lld", &n , &m);
for(int i = 1 ; i <= n ; i++){
scanf("%lld" , &a[i].a);
}
for(int i = 1 ; i <= n ; i++){
scanf("%lld" , &a[i].b);
}
build(1,1,n);
while(m--){
int op , x , y;
scanf("%lld%lld%lld" , &op , &x , &y);
if(op == 3){
cout << query(1,1,n,x,y).mx << endl;
}
else{
update(1,1,n,x,y,op);
}
}
}