#include<bits/stdc++.h>
using namespace std;
long long n,q,a[500010],op,x,y,k,ans;
struct tree{
long long l,r,tag1,tag2,minn,maxx;
}t[2000010];
long long read(){
char ch=getchar();long long sgn=1,x=0;
while(ch<'0'||ch>'9'){
if(ch=='-'){sgn=-1;}ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch&15);ch=getchar();
}
return x*sgn;
}
void build(long long i,long long l,long long r){
t[i].l=l;t[i].r=r;
t[i].tag1=0;t[i].tag2=0;
if(l==r){
t[i].maxx=a[l];t[i].minn=a[l];
return;
}
build(i*2,l,(l+r)/2);
build(i*2+1,(l+r)/2+1,r);
t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
}
void pushdown(long long i){
if(t[i].tag1==0&&t[i].tag2==0){
return;
}
if(t[i].tag1!=0){
t[i*2].maxx=t[i].tag1;t[i*2].minn=t[i].tag1;
t[i*2].tag1=t[i].tag1;t[i*2].tag2=0;
t[i*2+1].maxx=t[i].tag1;t[i*2+1].minn=t[i].tag1;
t[i*2+1].tag1=t[i].tag1;t[i*2+1].tag2=0;
t[i].tag1=0;
}
if(t[i].tag2!=0){
t[i*2].maxx+=t[i].tag2;t[i*2].minn+=t[i].tag2;
t[i*2].tag1+=t[i].tag2;t[i*2].tag2+=t[i].tag2;
t[i*2+1].maxx+=t[i].tag2;t[i*2+1].minn+=t[i].tag2;
t[i*2+1].tag1+=t[i].tag2;t[i*2+1].tag2+=t[i].tag2;
t[i].tag2=0;
}
}
void step1(long long i){
if(x<=t[i].r&&y>=t[i].l){
if(x<=t[i].l&&y>=t[i].r){
t[i].tag2+=k;t[i].maxx+=k;t[i].minn+=k;
return;
}
pushdown(i);
step1(i*2);
step1(i*2+1);
t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
}
}
void step2(long long i){
if(x<=t[i].r&&y>=t[i].l){
if(x<=t[i].l&&y>=t[i].r){
t[i].tag1=k;t[i].maxx=k;t[i].minn=k;t[i].tag2=0;
return;
}
pushdown(i);
step2(i*2);
step2(i*2+1);
t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
}
}
void step3(long long i){
if(x<=t[i].r&&y>=t[i].l){
if(x<=t[i].l&&y>=t[i].r){
t[i].tag1=k;t[i].maxx=k;t[i].minn=k;t[i].tag2=0;
return;
}
pushdown(i);
step3(i*2);
step3(i*2+1);
t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
}
}
void step4(long long i){
if(x<=t[i].r&&y>=t[i].l){
if(x<=t[i].l&&y>=t[i].r){
t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
ans=max(ans,t[i].maxx);
return;
}
pushdown(i);
step4(i*2);
step4(i*2+1);
t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
ans=max(ans,t[i].maxx);
}
}
int main(){
n=read();q=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,1,n);
while(q--){
op=read();
if(op==1){
x=read();y=read();k=read();
step1(1);
}
if(op==2){
x=read();y=read();k=read();
step2(1);
}
if(op==3){
x=read();y=read();k=read();
step3(1);
}
if(op==4){
x=read();y=read();
ans=-9999999999;
step4(1);
printf("%lld\n",ans);
}
}
return 0;
}
输出:7 7 8