50pts WA6789 RE10
#include<bits/stdc++.h>
#define int long long
#define INF -0x7fffffffffffffff
using std::cin;
using std::cout;
int n,m;
int b[1000086];
struct sb{
int max,sum,cha,tag;//cha->change
}a[1000086];
void build(int w,int l,int r){
a[w].cha=INF;
if(l==r){
a[w].sum=b[l];
a[w].max=b[l];
return;
}
int mid=(l+r)/2;
build(2*w,l,mid);
build(2*w+1,mid+1,r);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
void spread(int w,int l,int r){
if(a[w].cha!=INF){
int mid=(l+r)/2;
a[2*w].sum=a[w].cha*(mid-l+1);
a[2*w].cha=a[w].cha;
a[2*w].max=a[w].max;
a[2*w].tag=0;
a[2*w+1].sum=a[w].cha*(r-mid);
a[2*w+1].cha=a[w].cha;
a[2*w+1].max=a[w].max;
a[2*w+1].tag=0;
a[w].cha=0;
}
if(a[w].tag){
int mid=(l+r)/2;
a[2*w].sum+=a[w].tag*(mid-l+1);
a[2*w].tag+=a[w].tag;
a[2*w].max+=a[w].tag;
a[2*w+1].sum+=a[w].tag*(r-mid);
a[2*w+1].tag+=a[w].tag;
a[2*w+1].max+=a[w].tag;
a[w].tag=0;
}
}
void add(int w,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
a[w].tag+=k;
a[w].sum+=k*(r-l+1);
a[w].max+=k;
return;
}
spread(w,l,r);
int mid=(l+r)/2;
if(ql<=mid)add(2*w,l,mid,ql,qr,k);
if(qr>mid)add(2*w+1,mid+1,r,ql,qr,k);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
void change(int w,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
a[w].cha=k;
a[w].sum=k*(r-l+1);
a[w].tag=0;
a[w].max=k;
return;
}
spread(w,l,r);
int mid=(l+r)/2;
if(ql<=mid)change(2*w,l,mid,ql,qr,k);
if(qr>mid)change(2*w+1,mid+1,r,ql,qr,k);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
int getmax(int w,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return a[w].max;
spread(w,l,r);
int mid=(l+r)/2,ans=0;
if(ql<=mid)ans=std::max(ans,getmax(2*w,l,mid,ql,qr));
if(qr>mid)ans=std::max(ans,getmax(2*w+1,mid+1,r,ql,qr));
return ans;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>b[i];
build(1,1,n);
while(m--){
int op,l,r,k;
cin>>op>>l>>r;
if(!(op-1)){
cin>>k;
change(1,1,n,l,r,k);
}
else if(!(op-2)){
cin>>k;
add(1,1,n,l,r,k);
}
else{
cout<<getmax(1,1,n,l,r)<<"\n";
}
// cout<<getmax(1,1,n,1,n)<<"----\n";
}
return 0;
}