劳资改半天了,#6老是wa
#include<bits/stdc++.h>
#define ll long long
#define lc x<<1
#define rc x<<1|1
using namespace std;
const ll N=1e6+10;
struct node{
ll l,r,maxn,lazy_add;
ll lazy_set=-1e17;
bool is_set=0;
}tr[N<<2];
ll n,m,a[N];
void pushup(ll x){
tr[x].maxn=max(tr[lc].maxn,tr[rc].maxn);
return;
}
void pushdown(ll x){
if (tr[x].is_set) {
tr[lc].maxn = tr[x].lazy_set;
tr[rc].maxn = tr[x].lazy_set;
tr[lc].lazy_set = tr[x].lazy_set;
tr[rc].lazy_set = tr[x].lazy_set;
tr[lc].lazy_add = 0;
tr[rc].lazy_add = 0;
tr[lc].is_set=1;
tr[rc].is_set=1;
tr[x].is_set=0;
}
if (tr[x].lazy_add) {
tr[lc].maxn += tr[x].lazy_add;
tr[rc].maxn += tr[x].lazy_add;
tr[lc].lazy_add += tr[x].lazy_add;
tr[rc].lazy_add += tr[x].lazy_add;
tr[x].lazy_add = 0;
}
return;
}
void build(ll x,ll l,ll r){
tr[x].l=l;tr[x].r=r;
if(l==r){
tr[x].maxn=a[l];
return;
}
ll m=(l+r)>>1;
build(lc,l,m);
build(rc,m+1,r);
pushup(x);
return;
}
void change_add(ll x,ll l,ll r,ll k){
if(l<=tr[x].l&&tr[x].r<=r){
tr[x].maxn+=k;
tr[x].lazy_add+=k;
return;
}
pushdown(x);
ll m=(tr[x].l+tr[x].r)>>1;
if(l<=m) change_add(lc,l,r,k);
if(r>m) change_add(rc,l,r,k);
pushup(x);
return;
}
void change_set(ll x,ll l,ll r,ll k){
if(l<=tr[x].l&&tr[x].r<=r){
tr[x].maxn=k;
tr[x].lazy_set=k;
tr[x].lazy_add=0;
tr[x].is_set=1;
return;
}
pushdown(x);
ll m=(tr[x].l+tr[x].r)>>1;
if(l<=m) change_set(lc,l,r,k);
if(r>m) change_set(rc,l,r,k);
pushup(x);
return;
}
ll fin(ll x,ll l,ll r){
if(l<=tr[x].l&&tr[x].r<=r) return tr[x].maxn;
pushdown(x);
ll m=(tr[x].l+tr[x].r)>>1,maxm=-1e10;
if(l<=m) maxm=max(maxm,fin(lc,l,r));
if(r>m) maxm=max(maxm,fin(rc,l,r));
return maxm;
}
int main(){
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(ll i=1;i<=m;i++){
ll op,l,r,x;
cin>>op;
if(op==1){
cin>>l>>r>>x;
change_set(1,l,r,x);
}else if(op==2){
cin>>l>>r>>x;
change_add(1,l,r,x);
}else if(op==3){
cin>>l>>r;
cout<<fin(1,l,r)<<"\n";
}
}
return 0;
}