代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,q,op,x,y,k,a[N],tag1[N<<2],tag2[N<<2],ans[N<<2];
inline int ls(int p) {return p<<1;}
inline int rs(int p) {return p<<1|1;}
inline void push_up(int p) {ans[p]=max(ans[ls(p)],ans[rs(p)]);}
inline void build(int p,int l,int r) {
tag1[p]=tag2[p]=-2e18;
if(l==r) {
ans[p]=a[l];
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
inline void f1(int p,int l,int r,int k) {tag2[p]=0,tag1[p]=k,ans[p]=k;}
inline void f2(int p,int l,int r,int k) {tag2[p]+=k,ans[p]+=k*(r-l+1);}
inline void push_down_cover(int p,int l,int r) {
if(tag1[p]!=-2e18) {
int mid=l+r>>1;
f1(ls(p),l,mid,tag1[p]);
f1(rs(p),mid+1,r,tag1[p]);
tag1[p]=-2e18;
}
}
inline void push_down_sum(int p,int l,int r) {
if(tag2[p]!=-2e18) {
push_down_cover(p,l,r);
int mid=l+r>>1;
f2(ls(p),l,mid,tag2[p]);
f2(rs(p),mid+1,r,tag2[p]);
tag2[p]=0;
}
}
inline void push_down(int p,int l,int r) {push_down_sum(p,l,r),push_down_cover(p,l,r);}
inline void add1(int x,int y,int k,int l,int r,int p) {
if(x<=l&&r<=y) {
f2(p,l,r,k);
return;
}
push_down(p,l,r);
int mid=l+r>>1;
if(x<=mid) add1(x,y,k,l,mid,ls(p));
if(y>mid) add1(x,y,k,mid+1,r,rs(p));
push_up(p);
}
inline void add2(int x,int y,int k,int l,int r,int p) {
if(x<=l&&r<=y) {
f1(p,l,r,k);
return;
}
push_down(p,l,r);
int mid=l+r>>1;
if(x<=mid) add2(x,y,k,l,mid,ls(p));
if(y>mid) add2(x,y,k,mid+1,r,rs(p));
push_up(p);
}
inline int gtmx(int x,int y,int l,int r,int p) {
int res=-2e18;
if(x<=l&&r<=y) return ans[p];
push_down(p,l,r);
int mid=l+r>>1;
if(x<=mid) res=max(res,gtmx(x,y,l,mid,ls(p)));
if(y>mid) res=max(res,gtmx(x,y,mid+1,r,rs(p)));
return res;
}
signed main() {
ios_base::sync_with_stdio(NULL);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--) {
cin>>op>>x>>y;
if(op==1) cin>>k,add2(x,y,k,1,n,1);
else if(op==2) cin>>k,add1(x,y,k,1,n,1);
else cout<<gtmx(x,y,1,n,1)<<'\n';
}
return 0;
}