#include<bits/stdc++.h>
#define N 1000010
#define ll long long
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
using namespace std;
ll a[N],tag1[N<<2],tag2[N<<2],tree[N<<2];
int n,m;
void push_up(int p){tree[p]=max(tree[ls(p)],tree[rs(p)]);}
void build(int p,int pl,int pr)
{
tag1[p]=tag2[p]=0;
if(pl==pr){tree[p]=a[pl];return ;}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void add_tag1(int p,int pl,int pr,ll d)
{
tag1[p]=(pr-pl+1)*d-tree[p];
tree[p]=d;
}
void add_tag2(int p,int pl,int pr,ll d)
{
tag2[p]+=d;
tree[p]+=d;
}
void push_down1(int p,int pl,int pr)
{
if(!tag1[p])return ;
int mid=(pl+pr)>>1;
add_tag1(ls(p),pl,mid,tag1[p]);
add_tag1(rs(p),mid+1,pr,tag1[p]);
tag1[p]=0;
}
void push_down2(int p,int pl,int pr)
{
if(!tag2[p])return ;
int mid=(pl+pr)>>1;
add_tag2(ls(p),pl,mid,tag2[p]);
add_tag2(rs(p),mid+1,pr,tag2[p]);
tag2[p]=0;
}
void update(int L,int R,int p,int pl,int pr,ll d)
{
if(L<=pl&&R>=pr)
{
add_tag1(p,pl,pr,d);
add_tag2(p,pl,pr,d);
return ;
}
push_down1(p,pl,pr);
push_down2(p,pl,pr);
int mid=(pl+pr)>>1;
if(L<=mid)update(L,R,ls(p),pl,mid,d);
if(R>=mid+1)update(L,R,rs(p),mid+1,pr,d);
push_up(p);
}
ll query(int L,int R,int p,int pl,int pr)
{
if(L<=pl&&R>=pr)return tree[p];
push_down1(p,pl,pr);
push_down2(p,pl,pr);
ll ans=-2e18;
int mid=(pl+pr)>>1;
if(L<=mid)ans=max(ans,query(L,R,ls(p),pl,mid));
if(R>=mid+1)ans=max(ans,query(L,R,rs(p),mid+1,pr));
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
ll x;
int op,l,r;
cin>>op;
if(op==1)
{
cin>>l>>r>>x;
update(l,r,1,1,n,x);
}
if(op==2)
{
cin>>l>>r>>x;
update(l,r,1,1,n,x);
}
if(op==3)
{
cin>>l>>r;
cout<<query(l,r,1,1,n)<<"\n";
}
}
return 0;
}
代码求调