样例过了,提交全WA
#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T& x) {
x=0;T f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=x*f;
return;
}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){
read(x);
read(arg...);
}
template <typename T>void write(T x) {
if(x<0)putchar('-'),x=-x;
if(x<10)putchar(x+'0');
else write(x/10),putchar(x%10+'0');
}
template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){
write(x);
putchar(' ');
write(arg...);
}
#define MAXN 500005
#define L (x<<1)
#define R (x<<1|1)
#define mid ((l+r)>>1)
#define INF 2147483647
int n,m,a[MAXN],b[MAXN];
namespace SegTree{
struct SGT{
int l,r,psi,lpsi,rpsi,mx,mn;
SGT(int l=0,int r=0,int psi=0,int lpsi=0,int rpsi=0,int mx=0,int mn=INF):l(l),r(r),psi(psi),lpsi(lpsi),rpsi(rpsi),mx(mx),mn(mn){}
}sgt[MAXN<<2];
inline void pushup(SGT &x,SGT l,SGT r){
x.mx=max(l.mx,r.mx);
x.mn=min(l.mn,r.mn);
x.lpsi=max(l.lpsi,r.mx-l.mn);
x.rpsi=max(r.rpsi,l.mx-r.mn);
if(x.r-x.l+1>=3) x.psi=max(max(l.psi,r.psi),max(l.rpsi+r.mx,r.lpsi+l.mx));
return;
}
inline void build(int x,int l,int r){
sgt[x].l=l,sgt[x].r=r;
if(l==r){sgt[x].mn=b[l],sgt[x].mx=a[l];return;}
build(L,l,mid);
build(R,mid+1,r);
pushup(sgt[x],sgt[L],sgt[R]);
return;
}
inline void a_update(int x,int l,int v){
if(sgt[x].l==sgt[x].r&&sgt[x].l==l){sgt[x].mx=v;return;}
if(sgt[x].l>l||sgt[x].r<l) return;
a_update(L,l,v);
a_update(R,l,v);
pushup(sgt[x],sgt[L],sgt[R]);
return;
}
inline void b_update(int x,int l,int v){
if(sgt[x].l==sgt[x].r&&sgt[x].l==l){sgt[x].mn=v;return;}
if(sgt[x].l>l||sgt[x].r<l) return;
b_update(L,l,v);
b_update(R,l,v);
pushup(sgt[x],sgt[L],sgt[R]);
return;
}
inline SGT query(int x,int l,int r){
if(sgt[x].l>=l&&sgt[x].r<=r) return sgt[x];
if(sgt[x].r<l||sgt[x].l>r) return SGT{0,0,0,0,0,0,INF};
SGT LSGT=query(L,l,r),RSGT=query(R,l,r),resSGT=SGT{0,0,0,0,0,0,INF};
if(!LSGT.l) return RSGT;
else if(!RSGT.l) return LSGT;
resSGT.l=LSGT.l,resSGT.r=RSGT.r;
pushup(resSGT,LSGT,RSGT);
return resSGT;
}
}
using namespace SegTree;
signed main(){
read(n,m);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) read(b[i]);
build(1,1,n);
while(m--){
int opt,x,y;
read(opt,x,y);
if(opt==1) a_update(1,x,y);
else if(opt==2) b_update(1,x,y);
else write(query(1,x,y).psi),putchar('\n');
}
return 0;
}