```
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
struct node{
ll l,r,Max,laz_add,laz_cover_need,laz_cover_num;
} tre[4000010];
ll n,m,z,x,y,c,ans,a[1000010];
void make(ll l,ll r,ll s){//建树
tre[s].l=l;
tre[s].r=r;
if(l==r){
tre[s].Max=a[l];
return;
}
ll mid=(l+r)>>1;
make(l,mid,s<<1);
make(mid+1,r,s<<1|1);
tre[s].Max=max(tre[s<<1].Max,tre[s<<1|1].Max);
return;
}
void push_d(ll s)//清除懒惰标记
{
if(tre[s].laz_cover_need==1){
tre[s*2].laz_cover_need=1;
tre[s*2].laz_cover_num=tre[s].laz_cover_num;
tre[s*2].laz_add=0;
tre[s*2].Max=tre[s].laz_cover_num;
tre[s*2+1].laz_cover_need=1;
tre[s*2+1].laz_cover_num=tre[s].laz_cover_num;
tre[s*2+1].laz_add=0;
tre[s*2+1].Max=tre[s].laz_cover_num;
tre[s].laz_cover_need=0;
tre[s].laz_cover_num=0;
}
if(tre[s].laz_add!=0){
tre[s*2].Max+=tre[s].laz_add;
tre[s*2].laz_add+=tre[s].laz_add;
tre[s*2+1].Max+=tre[s].laz_add;
tre[s*2+1].laz_add+=tre[s].laz_add;
tre[s].laz_add=0;
}
return;
}
void change_add(ll l,ll r,ll s,ll cc){//区间加减
if(tre[s].l>=l&&tre[s].r<=r){
tre[s].Max+=cc;
tre[s].laz_add+=cc;
return;
}
push_d(s);
if(tre[s*2].r>=l)
change_add(l,r,s*2,cc);
if(tre[s*2+1].l<=r)
change_add(l,r,s*2+1,cc);
tre[s].Max=max(tre[s*2].Max,tre[s*2+1].Max);
return;
}
void change_cover(ll l,ll r,ll s,ll cc){//区间修改
if(tre[s].l>=l&&tre[s].r<=r){
tre[s].laz_add=0;
tre[s].Max=cc;
tre[s].laz_cover_need=1;
tre[s].laz_cover_num=cc;
return;
}
push_d(s);
if(tre[s*2].r>=l)
change_cover(l,r,s*2,cc);
if(tre[s*2+1].l<=r)
change_cover(l,r,s*2+1,cc);
tre[s].Max=max(tre[s*2].Max,tre[s*2+1].Max);
return;
}
ll ask(ll l,ll r,ll s){//询问区间最大值
if(tre[s].l>=l&&tre[s].r<=r)
return tre[s].Max;
push_d(s);
ll value=(ll)-1e15;
if(tre[s*2].r>=l)
value=max(value,ask(l,r,s*2));
if(tre[s*2+1].l<=r)
value=max(value,ask(l,r,s*2+1));
return value;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
make(1,n,1);
for(ll i=1;i<=m;i++){
ll q,l,r,num;
cin>>q;
if(q==1){
cin>>l>>r>>num;
change_cover(l,r,1,num);
}
else if(q==2){
cin>>l>>r>>num;
change_add(l,r,1,num);
}
else{
cin>>l>>r;
cout<<ask(l,r,1)<<"\n";
}
}
return 0;
}
```
by zhsm_ @ 2022-08-06 16:19:40
超了一半
有十名特判也能过
https://www.luogu.com.cn/paste/lkj4rmbl
by ls2128606 @ 2022-08-06 16:58:22
什么意思
by leozty @ 2022-08-06 18:37:25
已经对了,谢谢各位大佬的帮助
by leozty @ 2022-08-07 07:49:24