#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int i,m,n,w,x,y;
bool c[maxn+2<<2|2];
long long a[maxn+10],ad[maxn+2<<2|2],cg[maxn+2<<2|2],sumn[maxn+2<<2|2],z;
void bld(int q,int lt,int rt)
{
int md=lt+rt>>1;
if(lt==rt)
{
sumn[q]=a[lt];
return;
}
bld(q<<1,lt,md);
bld(q<<1|1,md+1,rt);
sumn[q]=max(sumn[q<<1],sumn[q<<1|1]);
return;
}
void add(int q,int lt,int rt,int v)
{
ad[q]+=v;
sumn[q]+=v;
return;
}
void ch(int q,int lt,int rt,int v)
{
c[q]=true;
cg[q]=sumn[q]=v;
ad[q]=0;
return;
}
void pushdn(int q,int lt,int rt,int md)
{
if(!ad[q])
return;
add(q<<1,lt,md,ad[q]);
add(q<<1|1,md+1,rt,ad[q]);
ad[q]=0;
return;
}
void pushchg(int q,int lt,int rt,int md)
{
if(!c[q])
return;
ch(q<<1,lt,md,cg[q]);
ch(q<<1|1,md+1,rt,cg[q]);
c[q]=false;
return;
}
long long qry(int q,int lt,int rt,int x,int y)
{
int md=lt+rt>>1;
long long ans=LLONG_MIN;
if(lt>=x&&rt<=y)
return sumn[q];
pushchg(q,lt,rt,md);
pushdn(q,lt,rt,md);
if(x<=md)
ans=max(ans,qry(q<<1,lt,md,x,y));
if(md<=y-1)
ans=max(ans,qry(q<<1|1,md+1,rt,x,y));
return ans;
}
void mdf(int q,int lt,int rt,int x,int y,long long v)
{
int md=lt+rt>>1;
if(lt>=x&&rt<=y)
{
add(q,lt,rt,v);
return;
}
pushdn(q,lt,rt,md);
if(x<=md)
mdf(q<<1,lt,md,x,y,v);
if(md<=y-1)
mdf(q<<1|1,md+1,rt,x,y,v);
sumn[q]=max(sumn[q<<1],sumn[q<<1|1]);
return;
}
void chg(int q,int lt,int rt,int x,int y,long long v)
{
int md=lt+rt>>1;
if(lt>=x&&rt<=y)
{
ch(q,lt,rt,v);
return;
}
pushchg(q,lt,rt,md);
pushdn(q,lt,rt,md);
if(x<=md)
chg(q<<1,lt,md,x,y,v);
if(md<=y-1)
chg(q<<1|1,md+1,rt,x,y,v);
sumn[q]=max(sumn[q<<1],sumn[q<<1|1]);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%lld",&a[i]);
bld(1,1,n);
while(m--)
{
scanf("%d%d%d",&w,&x,&y);
if(w==1)
{
scanf("%lld",&z);
chg(1,1,n,x,y,z);
}
else if(w==2)
{
scanf("%lld",&z);
mdf(1,1,n,x,y,z);
}
else printf("%lld\n",qry(1,1,n,x,y));
}
return 0;
}
记录,悬赏关注。