只拿到了第一、二个测试点的分,其他都TLE。但理论上复杂度只有O(m*log(n)),自认为代码效率不比线段树低,但跑得就是慢。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,a[N],b[N];
struct xx{
int amx,bmi,lx,rx,ans;
};
xx qiu(int l,int r){
xx ret;
if(l==r){
ret.amx=a[l],ret.bmi=b[l];
return ret;
}
int mid=(l+r)>>1;
xx res1=qiu(l,mid),res2=qiu(mid+1,r);
ret.amx=max(res1.amx,res2.amx);
ret.bmi=min(res1.bmi,res2.bmi);
ret.lx=res1.amx-res2.bmi;
ret.rx=res2.amx-res1.bmi;
if(l+1==r) return ret;
ret.lx=max(ret.lx,res1.lx);
ret.rx=max(ret.rx,res1.rx);
ret.ans=res1.lx+res2.amx;
if(r-mid>=2){
ret.lx=max(ret.lx,res2.lx);
ret.rx=max(ret.rx,res2.rx);
ret.ans=max(ret.ans,res2.rx+res1.amx);
}
if(mid-l+1>=3) ret.ans=max(ret.ans,res1.ans);
if(r-mid>=3) ret.ans=max(ret.ans,res2.ans);
//printf("%d %d %d %d %d %d %d\n",l,r,ret.amx,ret.bmi,ret.lx,ret.rx,ret.ans);
return ret;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
int op,l,r;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op,&l,&r);
if(op==1) a[l]=r;
else if(op==2) b[l]=r;
else{
xx res=qiu(l,r);
printf("%d\n",res.ans);
}
}
return 0;
}