lgx57 @ 2024-05-21 20:24:27
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void fio(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int ls(int x){
return x<<1;
}
int rs(int x){
return x<<1|1;
}
int n,q;
const int N=1e5+5;
int a[N],tree[N<<2],tag1[N<<2],tag2[N<<2];
void push_up(int p){
tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void build(int p,int pl,int pr){
if (pl==pr){
tag2[p]=a[pl];
tree[p]=a[pl];
return ;
}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void addtag1(int p,int pl,int pr,int d){
tag1[p]+=d;
tree[p]+=d*(pr-pl+1);
}
void addtag2(int p,int pl,int pr,int d){
tag2[p]=d;
tree[p]=d*(pr-pl+1);
}
void push_down1(int p,int pl,int pr){
if (tag1[p]){
int mid=(pl+pr)>>1;
addtag1(ls(p),pl,mid,tag1[p]);
addtag1(rs(p),mid+1,pr,tag1[p]);
tag1[p]=0;
}
}
void push_down2(int p,int pl,int pr){
int mid=(pl+pr)>>1;
addtag2(ls(p),pl,mid,tag2[p]);
addtag2(rs(p),mid+1,pr,tag2[p]);
tag2[p]=0;
}
void update1(int l,int r,int p,int pl,int pr,int d){
if (l<=pl&&pr<=r){
addtag1(p,pl,pr,d);
return ;
}
push_down1(p,pl,pr);
int mid=(pl+pr)>>1;
if (l<=mid){
update1(l,r,ls(p),pl,mid,d);
}
if (r>mid){
update1(l,r,rs(p),mid+1,pr,d);
}
push_up(p);
}
void update2(int l,int r,int p,int pl,int pr,int d){
if (l<=pl&&pr<=r){
addtag2(p,pl,pr,d);
return ;
}
push_down2(p,pl,pr);
int mid=(pl+pr)>>1;
if (l<=mid){
update2(l,r,ls(p),pl,mid,d);
}
if (r>mid){
update2(l,r,rs(p),mid+1,pr,d);
}
push_up(p);
}
int query(int l,int r,int p,int pl,int pr){
if (l<=pl&&pr<=r){
return tree[p];
}
push_down2(p,pl,pr);
push_down1(p,pl,pr);
int ans=0;
int mid=(pl+pr)>>1;
if (l<=mid){
ans=max(ans,query(l,r,ls(p),pl,mid));
}
if (r>mid){
ans=max(ans,query(l,r,rs(p),mid+1,pr));
}
return ans;
}
signed main(){
fio();
cin>>n>>q;
for (int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while (q--){
int opt,x,y,k;
cin>>opt;
if (opt==1){
cin>>x>>y>>k;
update2(x,y,1,1,n,k);
}
else if(opt==2){
cin>>x>>y>>k;
update1(x,y,1,1,n,k);
}
else{
cin>>x>>y;
cout<<query(x,y,1,1,n)<<endl;
}
}
return 0;
}