so_find_skind @ 2023-07-23 16:52:38
#include<bits/stdc++.h>
using namespace std;
int n,q,a[1000005];
int s[4000005],mark[4000005],mak[4000005],k[4000005];
void build(int p,int l,int r){
if(l==r){
cin>>s[p];
return ;
}
build(2*p,l,(l+r)/2);
build(2*p+1,(l+r)/2+1,r);
s[p]=max(s[p*2],s[p*2+1]);
}
void down(int p,int l,int r){
if(!k[p])
return ;
if(k[p]==1){
mark[p*2]=mark[p];
s[p*2]=mark[p];
if(!mak[p*2])
k[p*2]=1;
mark[2*p+1]=mark[p];
if(!mak[p*2+1])
k[p*2+1]=1;
s[p*2+1]=mark[p];
mark[p]=0;
if(mak[p]){
mak[p*2]+=mak[p];
s[p*2]+=mak[p]*((l+r)/2-l);
if(!mark[p*2])
k[p*2]=2;
mak[p*2+1]+=mak[p];
if(!mark[p*2+1])
k[p*2+1]=2;
s[p*2+1]+=mak[p]*(r-(l+r)/2-1);
mak[p]=0;
}
}else{
if(mak[p]){
mak[p*2]+=mak[p];
if(!mark[p*2])
k[p*2]=2;
s[p*2]+=mak[p]*((l+r)/2-l);
mak[p*2+1]+=mak[p];
if(!mark[p*2+1])
k[p*2+1]=2;
s[p*2+1]+=mak[p]*(r-(l+r)/2-1);
mak[p]=0;
}
if(mark[p]){
mark[p*2]=mark[p];
if(!mak[p*2])
k[p*2]=1;
s[p*2]=mark[p];
mark[2*p+1]=mark[p];
if(!mak[p*2+1])
k[p*2+1]=1;
s[p*2+1]=mark[p];
mark[p]=0;
}
}
}
void update1(int p,int l,int r,int x,int y,int v){
if(x>r || y<l)
return ;
if(x<=l && y>=r){
s[p]=v;
mark[p]=v;
if(!mak[p])
k[p]=1;
return ;
}
down(p,l,r);
update1(2*p,l,(l+r)/2,x,y,v);
update1(2*p+1,(l+r)/2+1,r,x,y,v);
s[p]=max(s[2*p],s[2*p+1]);
}
void update2(int p,int l,int r,int x,int y,int v){
if(x>r || y<l)
return ;
if(x<=l && y>=r){
s[p]+=v;
mak[p]=v;
if(!mark[p])
k[p]=2;
return ;
}
down(p,l,r);
update2(2*p,l,(l+r)/2,x,y,v);
update2(2*p+1,(l+r)/2+1,r,x,y,v);
s[p]=max(s[2*p],s[2*p+1]);
}
int query(int p,int l,int r,int x,int y){
if(x>r || y<l)
return 0;
if(x<=l && y>=r)
return s[p];
down(p,l,r);
return max(query(2*p,l,(l+r)/2,x,y),query(2*p+1,(l+r)/2+1,r,x,y));
}
int main(){
cin>>n>>q;
build(1,1,n);
for(int i=1,op,l,r,x;i<=q;i++){
cin>>op>>l>>r;
if(op==1){
cin>>x;
update1(1,1,n,l,r,x);
}else if(op==2){
cin>>x;
update2(1,1,n,l,r,x);
}else{
cout<<query(1,1,n,l,r)<<"\n";
}
}
return 0;
}