#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,inf=-1e9;
#define ll long long
int n,m,a[N],b[N];
struct node
{
int l,r;
int maxn,minn,mab,mba,ans;
}t[N*4];
node up(node a,node b)//左儿子与右儿子
{
cout<<0<<" "<<a.l<<" "<<b.r<<" "<<"\n";
node f;
f.minn=min(a.minn,b.minn);
f.maxn=max(a.maxn,b.maxn);
f.mab=max(max(a.mab,b.mab),a.maxn-b.minn);//!!!
f.mba=max(max(a.mba,b.mba),b.maxn-a.minn);//!!!
f.ans=max(max(a.ans,b.ans),max(f.mab+b.maxn,f.mba+a.maxn));
return f;
}
void build(int k,int l,int r)
{
//cout<<1<<" "<<k<<" "<<x<<" "<<y<<" "<<"\n";
t[k].l=l,t[k].r=r;
if(l==r)
{
t[k].ans=t[k].mab=t[k].mba=inf;
t[k].minn=b[l];
t[k].maxn=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
t[k]=up(t[k<<1],t[k<<1|1]);
return;
}
void change1(int k,int x,int y)
{
cout<<1<<" "<<k<<" "<<x<<" "<<y<<" "<<"\n";
if(t[k].l==t[k].r)
{
t[k].maxn=y;
return;
}
int mid=t[k].l+t[k].r>>1;
if(x<=mid)
change1(k<<1,x,y);
else
change1(k<<1|1,x,y);
t[k]=up(t[k<<1],t[k<<1|1]);
}
void change2(int k,int x,int y)
{
cout<<2<<" "<<k<<" "<<x<<" "<<y<<" "<<"\n";
if(t[k].l==t[k].r)
{
t[k].minn=y;
return;
}
int mid=t[k].l+t[k].r>>1;
if(x<=mid)
change2(k<<1,x,y);
else
change2(k<<1|1,x,y);
t[k]=up(t[k<<1],t[k<<1|1]);
}
ll ask(int k,int x,int y)
{
cout<<3<<" "<<k<<" "<<t[k].l<<" "<<t[k].r<<"\n";
if(x<=t[k].l && t[k].r<=y)
{
return t[k].ans;
}
int mid=(t[k].l+t[k].r)>>1;
ll res=0;
if(y<=mid)
res+=ask(k<<1,x,y);
if(mid<x)
res+=ask(k<<1|1,x,y);
return res;
}
int 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,1,n);
while(m--)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
change1(1,x,y);
else if(op==2)
change2(1,x,y);
else if(op==3)
cout<<ask(1,x,y)<<"\n";
}
return 0;
}
/*
6 6
1 4 2 3 5 6
5 3 4 1 6 7
3 2 5
3 1 6
1 2 3
3 1 6
2 6 1
3 1 6*/
rt 报错Segmetation fault