_liuyiqin @ 2024-12-09 20:24:26
#include<bits/stdc++.h>
using namespace std;
const int N(1e6+5);
#define int long long
int n,q;
int a[N];
struct node{
int l,r,ma=-1e18;
int tag,val=-1e18;
}t[N<<2];
inline void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].ma=a[l];
return;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
return ;
}
inline void pushdown_1(int p){
if(t[p].val!=-1e18){
t[p<<1].ma=t[p].val,t[p<<1|1].ma=t[p].val;
t[p<<1].val=t[p].val,t[p<<1|1].val=t[p].val;
t[p].val=-1e18,t[p].tag=0;
}
return ;
}
inline void pushdown_2(int p){
if(t[p].tag){
t[p<<1].ma+=t[p].tag,t[p<<1|1].ma+=t[p].tag;
t[p<<1].tag+=t[p].tag,t[p<<1|1].tag+=t[p].tag;
t[p].tag=0;
}
return ;
}
inline void modify_1(int p,int l,int r,int x){
if(l<=t[p].l&&r>=t[p].r){
t[p].val=x;
t[p].ma=x;
t[p].tag=0;
return;
}
pushdown_1(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) modify_1(p<<1,l,mid,x);
if(r>mid) modify_1(p<<1|1,mid+1,r,x);
t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
return;
}
inline void modify_2(int p,int l,int r,int x){
if(l<=t[p].l&&r>=t[p].r){
t[p].tag+=x;
t[p].ma+=x;
return;
}
pushdown_2(p);
int mid=t[p].l+t[p].r>>1;
if(l<=mid) modify_2(p<<1,l,mid,x);
if(r>mid) modify_2(p<<1|1,mid+1,r,x);
t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
return;
}
inline int query(int p,int l,int r){
if(l<=t[p].l&&r>=t[p].r) return t[p].ma;
pushdown_1(p);
pushdown_2(p);
int mid=t[p].l+t[p].r>>1;
int ans=-2e9;
if(l<=mid) ans=max(ans,query(p<<1,l,r));
if(r>mid) ans=max(ans,query(p<<1|1,l,r));
return ans;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(q--){
int op,l,r,x;
cin>>op>>l>>r;
if(op==1){
cin>>x;
modify_1(1,l,r,x);
}
else if(op==2){
cin>>x;
modify_2(1,l,r,x);
}
else if(op==3){
cout<<query(1,l,r)<<endl;
}
}
return 0;
}