Lanpinye_Only @ 2024-10-01 20:16:14
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define ls p<<1
#define rs p<<1|1
#define inf 1e18
using namespace std;
ll c[N<<2],tag1[N<<2]/*加*/,tag2[N<<2]//覆盖;
int n,m;
inline ll read(){
int x=0;
bool f=0;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return f?-x:x;
}
inline void up(int p){
c[p]=max(c[ls],c[rs]);
}
inline void down1(int p){
if(tag2[p]!=inf){
tag2[ls]=tag2[rs]=tag2[p];
c[ls]=c[rs]=tag2[p];
tag2[p]=inf;
tag1[ls]=tag1[rs]=0;
}
return;
}
inline void down2(int p){
tag1[ls]+=tag1[p];
tag1[rs]+=tag1[p];
c[ls]+=tag1[p];
c[rs]+=tag1[p];
tag1[p]=0;
return;
}
void build(int s,int t,int p){
tag2[p]=inf;
if(s==t){
c[p]=read();
return;
}
ll mid=s+t>>1;
build(s,mid,ls);
build(mid+1,t,rs);
up(p);
}
void add(int l,int r,int s,int t,int p,int k){
if(s>=l&&r>=t){
c[p]+=k;
tag1[p]+=k;
return;
}
ll mid=s+t>>1;
down1(p);
down2(p);
if(l<=mid)add(l,r,s,mid,ls,k);
if(r>mid)add(l,r,mid+1,t,rs,k);
up(p);
}
void add2(int l,int r,int s,int t,int p,int k){
if(s>=l&&r>=t){
c[p]=k;
tag2[p]=k;
tag1[p]=0;
return;
}
ll mid=s+t>>1;
down1(p);
down2(p);
if(l<=mid)add(l,r,s,mid,ls,k);
if(r>mid)add(l,r,mid+1,t,rs,k);
up(p);
}
ll query(int l,int r,int s,int t,int p){
if(s>=l&&t<=r){
return c[p];
}
down1(p);
down2(p);
ll mid=s+t>>1,a=-1e8;
if(l<=mid)a=max(query(l,r,s,mid,ls),a);
if(r>mid)a=max(query(l,r,mid+1,r,rs),a);
return a;
}
int main(){
n=read(),m=read();
build(1,n,1);
for(int i=1;i<=m;i++){
ll op,l,r,x;
op=read(),l=read(),r=read();
if(op==1){
x=read();
add2(l,r,1,n,1,x);
}
else if(op==2){
x=read();
add(l,r,1,n,1,x);
}
else{
cout<<query(l,r,1,n,1)<<"\n";
}
}
}