Angel_D @ 2024-11-14 15:54:16
#include<bits/stdc++.h>
#define int long long
#define lf(x) (x)<<1
#define rt(x) (x)<<1|1
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
struct node{
int lft,rgt,val,add,change,flag;
};
int const N=1e6+1;
node pos[N*4];
int a[N];
struct code{
int val,fl;
};
void pushup(int u){
pos[u].val=max(pos[lf(u)].val,pos[rt(u)].val);
return;
}
void build(int u,int l,int r){
pos[u].lft=l,pos[u].rgt=r;
if(l==r){
pos[u].val=a[l];
return;
}
else{
int mid=(l+r)>>1;
build(lf(u),l,mid);
build(rt(u),mid+1,r);
pushup(u);
}
return;
}
void mt_add(int u,int v){
pos[u].val+=v;
pos[u].add+=v;
return;
}
void mt_change(int u,int v){
pos[u].val=v;
pos[u].add=0;
pos[u].change=v;
pos[u].flag=1;
return;
}
void pushdown(int u){
if(pos[u].flag){
mt_change(lf(u),pos[u].change);
mt_change(rt(u),pos[u].change);
pos[u].flag=0;
}
else if(pos[u].add!=0){
mt_add(lf(u),pos[u].add);
mt_add(rt(u),pos[u].add);
pos[u].add=0;
}
return;
}
void update(int u,int L,int R,int add_v,int change_v,int fl){
if(pos[u].lft>=L&&pos[u].rgt<=R){
if(fl){
mt_change(u,change_v);
}
if(add_v!=0){
mt_add(u,add_v);
}
return;
}
else if(!(pos[u].lft>R||pos[u].rgt<L)){
pushdown(u);
update(lf(u),L,R,add_v,change_v,fl);
update(rt(u),L,R,add_v,change_v,fl);
pushup(u);
}
return;
}
int query(int u,int L,int R){
if(pos[u].lft>=L&&pos[u].rgt<=R){
return pos[u].val;
}
else if(!(pos[u].lft>R||pos[u].rgt<L)){
int mid=(L+R)>>1;
pushdown(u);
return max(query(rt(u),L,R),query(lf(u),L,R));
}
return -(1LL<<60);
}
int n,q;
signed main(){
IOS;
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
int op;
cin>>op;
if(op==1){
int ll,rr,x;
cin>>ll>>rr>>x;
update(1,ll,rr,0,x,1);
}
else if(op==2){
int ll,rr,x;
cin>>ll>>rr>>x;
update(1,ll,rr,x,0,0);
}
else if(op==3){
int ll,rr;
cin>>ll>>rr;
cout<<query(1,ll,rr)<<"\n";
}
}
return 0;
}
/*
6 6
1 1 4 5 1 4
1 1 2 6
2 3 4 2
3 1 4
3 2 3
1 1 6 -1
3 1 6
*/