#include <bits/stdc++.h>
#define ls (u<<1)
#define rs (u<<1|1)
#define mid (l+r>>1)
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1000005;
int a[N],val[N],tag1[N<<2],tag2[N<<2];
void gx(int u,int v1,int v2)
{
if(v1!=-inf)
{
val[u]=v1;
tag1[u]=v1;
tag2[u]=0;
}
else
{
val[u]+=v2;
tag2[u]+=v2;
}
}
void push_up(int u)
{
val[u]=max(val[ls],val[rs]);
}
void push_down(int u)
{
gx(ls,tag1[u],tag2[u]);
gx(rs,tag1[u],tag2[u]);
tag1[u]=-inf;
tag2[u]=0;
}
void build(int u,int l,int r)
{
if(l==r)
{
val[u]=a[l];
tag1[u]=-inf;
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
push_up(u);
}
void update(int u,int l,int r,int x,int y,int v1,int v2)
{
if(x<=l&&r<=y)
{
gx(u,v1,v2);
return;
}
push_down(u);
if(x<=mid)update(ls,l,mid,x,y,v1,v2);
if(y>mid)update(rs,mid+1,r,x,y,v1,v2);
push_up(u);
}
int query(int u,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return val[u];
}
push_down(u);
int res=-inf;
if(x<=mid)res=max(res,query(ls,l,mid,x,y));
if(y>mid)res=max(res,query(rs,mid+1,r,x,y));
return res;
}
int main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
while(q--)
{
int op,l,r,x;
cin>>op;
if(op==1)
{
cin>>l>>r>>x;
update(1,1,n,l,r,x,0);
}
else if(op==2)
{
cin>>l>>r>>x;
update(1,1,n,l,r,-inf,x);
}
else if(op==3)
{
cin>>l>>r;
cout<<query(1,1,n,l,r)<<'\n';
}
}
return 0;
}
tag1 和 v1 是区间覆盖,tag2 和 v2 是区间累加,val 存储区间最大值.
样例过不了