rt,另外这个点的数据和样例2一样,在本地跑也不慢。
#include<bits/stdc++.h>
using namespace std;
#define ls rt<<1
#define rs rt<<1|1
long long n,q,a[1000005];
struct node{ long long tr,cover,add; } tree[4000005];
inline void push_up(int rt){ tree[rt].tr=max(tree[ls].tr,tree[rs].tr); }
inline void cover_down(int rt){
if(tree[rt].cover!=INT_MIN){
tree[ls].add=tree[rs].add=0;
tree[ls].tr=tree[rs].tr=tree[rt].cover;
tree[ls].cover=tree[rs].cover=tree[rt].cover;
tree[rt].cover=INT_MIN;
}
}
inline void add_down(int rt){
if(tree[rt].add){
cover_down(rt);
tree[ls].tr+=tree[rt].add,tree[rs].tr+=tree[rt].add;
tree[ls].add+=tree[rt].add,tree[rs].add+=tree[rt].add;
tree[rt].add=0;
}
}
inline void push_down(int rt){ cover_down(rt),add_down(rt); }
void build(int rt,int l,int r){
if(l==r){
tree[rt].tr=a[l];
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
push_up(rt);
}
inline void cover_change(int rt,int l,int r,int x,int y,long long k){
if(l==x&&r==y){
tree[rt].add=0;
tree[rt].tr=tree[rt].cover=k;
return ;
}
push_down(rt);
int mid=(l+r)>>1;
if(y<=mid) cover_change(ls,l,mid,x,y,k);
else if(mid<x) cover_change(rs,mid+1,r,x,y,k);
else cover_change(ls,l,mid,x,mid,k),cover_change(rs,mid+1,r,mid+1,y,k);
push_up(rt);
}
inline void add_change(int rt,int l,int r,int x,int y,long long k){
if(l==x&&r==y){
cover_down(rt);
tree[rt].tr+=k;
tree[rt].add+=k;
return ;
}
push_down(rt);
int mid=(l+r)>>1;
if(y<=mid) add_change(ls,l,mid,x,y,k);
else if(mid<x) add_change(rs,mid+1,r,x,y,k);
else add_change(ls,l,mid,x,mid,k),add_change(rs,mid+1,r,mid+1,y,k);
push_up(rt);
}
inline long long calc(int rt,int l,int r,int x,int y){
if(l==x&&r==y) return tree[rt].tr;
push_down(rt);
int mid=(l+r)>>1;
if(y<=mid) return calc(ls,l,mid,x,y);
else if(x>mid) return calc(rs,mid+1,r,x,y);
else return max(calc(ls,l,mid,x,mid),calc(rs,mid+1,r,mid+1,y));
}
inline long long read(){
long long x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') if(ch=='-'){ f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
return f*x;
}
int main(){
n=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(int i=1;i<=n*4;i++) tree[i].cover=INT_MIN;
while(q--){
long long opt=read(),x=read(),y=read(),k;
if(opt<3){
k=read();
if(opt==1) cover_change(1,1,n,x,y,k);
else add_change(1,1,n,x,y,k);
}
else printf("%lld\n",calc(1,1,n,x,y));
}
return 0;
}
码风清奇求放过。