Elysialr @ 2024-10-15 12:51:34
#include<bits/stdc++.h>
using namespace std;
#define x_lc (x<<1)
#define x_rc (x<<1|1)
#define x_mid ((t[x].l+t[x].r)>>1)
#define inf -(1<<30)
struct SegmentTree{
long long l,r;
long long data;
long long add,give;
long long leng(){
return r-l+1;
}
};
long long a[1000001];
SegmentTree t[4000001];
void build(long long x,long long l,long long r){
t[x].l=l;
t[x].r=r;
t[x].add=0;
t[x].give=inf;
if(l==r){
t[x].data=a[l];
return;
}
build(x_lc,l,x_mid);
build(x_rc,x_mid+1,r);
t[x].data=max(t[x_lc].data,t[x_rc].data);
}
void spread(long long x){
if(t[x].give!=inf){
t[x_lc].give=t[x].give;
t[x_rc].give=t[x].give;
t[x_lc].data=t[x].give;
t[x_rc].data=t[x].give;
t[x_lc].add=0;
t[x_rc].add=0;
t[x].give=0;
t[x].add=0;
}
else{
t[x_lc].add+=t[x].add;
t[x_rc].add+=t[x].add;
t[x_lc].data+=t[x].add;
t[x_rc].data+=t[x].add;
t[x].add=0;
}
}
long long finds(long long x,long long l,long long r){
if(t[x].l>=l&&t[x].r<=r) return t[x].data;
spread(x);
long long res=0;
if(x_mid>=l) res=max(res,finds(x_lc,l,r));
if(x_mid+1<=r) res=max(res,finds(x_rc,l,r));
return res;
}
void adds(long long x,long long l,long long r,long long y){
if(t[x].l>=l&&t[x].r<=r){
if(t[x].give!=inf) t[x].give+=y;
else t[x].add+=y;
t[x].data+=y;
return;
}
spread(x);
if(x_mid>=l) adds(x_lc,l,r,y);
if(x_mid+1<=r) adds(x_rc,l,r,y);
t[x].data=max(t[x_lc].data,t[x_rc].data);
}
void change(long long x,long long l,long long r,long long y){
if(t[x].l>=l&&t[x].r<=r){
t[x].add=0;
t[x].give=y;
t[x].data=y;
return;
}
spread(x);
if(x_mid>=l) change(x_lc,l,r,y);
if(x_mid+1<=r) change(x_rc,l,r,y);
t[x].data=max(t[x_lc].data,t[x_rc].data);
}
int main(){
long long n,m;
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(long long i=1;i<=m;i++){
long long k,l,r;
cin>>k>>l>>r;
if(k==3) cout<<finds(1,l,r)<<endl;
else{
long long x;
cin>>x;
if(k==1) adds(1,l,r,x);
if(k==2) change(1,l,r,x);
}
}
return 0;
}
by nnn233 @ 2024-10-15 13:13:50
@Elysialr 加标记下传时如果孩子的赋值标记不为inf要给孩子的赋值标记也加上
by nnn233 @ 2024-10-15 13:17:37
@Elysialr 赋值标记清空应该是设成inf
by nnn233 @ 2024-10-15 14:13:25
@Elysialr
void spread(long long x){
if(t[x].give!=inf){
t[x_lc].give=t[x].give;
t[x_rc].give=t[x].give;
t[x_lc].data=t[x].give;
t[x_rc].data=t[x].give;
t[x_lc].add=0;
t[x_rc].add=0;
t[x].give=inf;
t[x].add=0;
}
else{
if(t[x_lc].give!=inf)t[x_lc].give+=t[x].add;
else t[x_lc].add+=t[x].add;
if(t[x_rc].give!=inf)t[x_rc].give+=t[x].add;
else t[x_rc].add+=t[x].add;
t[x_lc].data+=t[x].add;
t[x_rc].data+=t[x].add;
t[x].add=0;
}
}
by Elysialr @ 2024-10-15 14:35:18
@nnn233 谢谢已A