#include <cstdio>
#define ll long long
const ll INF=-1e17-10;
const int N=1e6+10;
int n,m,op,x,y,tmp;
int d[N];
ll xds[N<<2];
ll t1[N<<2],t2[N<<2];
ll max(ll a,ll b){return a>b?a:b;}
inline void pushtag(int l,int r,int g){
if(t2[g]!=INF){
xds[g<<1]=t2[g]+t1[g];
xds[g<<1|1]=t2[g]+t1[g];
t1[g<<1]=0;
t1[g<<1|1]=0;
t2[g<<1]=t2[g];
t2[g<<1|1]=t2[g];
}
else{
xds[g<<1]+=t1[g];
xds[g<<1|1]+=t1[g];
}
t1[g<<1]+=t1[g];
t1[g<<1|1]+=t1[g];
t2[g]=INF;
t1[g]=0;
}
void build(int l,int r,int g){
t2[g]=INF;
if(l==r){
xds[g]=d[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,g<<1);
build(mid+1,r,g<<1|1);
xds[g]=max(xds[g<<1],xds[g<<1|1]);
}
void add(int l,int r,int g){
// printf("%d %d %d\n",l,r,g);
if(l>=x && r<=y){
xds[g]+=tmp;
t1[g]+=tmp;
return ;
}
int mid=(l+r)>>1;
pushtag(l,r,g);
// printf("%d %d %d %d\n",g,xds[g],t1[g],t2[g]);
if(mid>=x)
add(l,mid,g<<1);
if(mid+1<=y)
add(mid+1,r,g<<1|1);
xds[g]=max(xds[g<<1],xds[g<<1|1]);
}
void update(int l,int r,int g){
if(l>=x && r<=y){
xds[g]=tmp;
t1[g]=0;
t2[g]=tmp;
return ;
}
int mid=(l+r)>>1;
pushtag(l,r,g);
if(mid>=x)
update(l,mid,g<<1);
if(mid+1<=y)
update(mid+1,r,g<<1|1);
xds[g]=max(xds[g<<1],xds[g<<1|1]);
}
int query(int l,int r,int g){
if(l>=x && r<=y)
return xds[g];
ll ans=INF;
int mid=(l+r)>>1;
pushtag(l,r,g);
if(mid>=x)
ans=max(ans,query(l,mid,g<<1));
if(mid+1<=y)
ans=max(ans,query(mid+1,r,g<<1|1));
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&d[i]);
build(1,n,1);
// for(int i=1;i<=n*4;i++)
// printf("%d %d\n",i,xds[i]);
while(m--){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
scanf("%d",&tmp);
update(1,n,1);
// printf("%d\n",xds[1]);
// for(int i=1;i<=n*4;i++)
// printf("%d %d\n",i,xds[i]);
// for(int i=1;i<=n*4;i++)
// printf("%d %d\n",i,t2[i]);
}
else if(op==2){
scanf("%d",&tmp);
add(1,n,1);
// printf("%d\n",xds[1]);
// for(int i=1;i<=n*4;i++)
// printf("%d %d\n",i,xds[i]);
}
else{
// for(int i=1;i<=n*4;i++)
// printf("%d %d\n",i,xds[i]);
printf("%d\n",query(1,n,1));
}
}
return 0;
}
调了好久,不知道错哪了。