WA 2~9,样例2没过,输出10
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,q,a[N],f[4*N],g[4*N],d[4*N];
void build(int root,int left,int right){
if(left==right){
f[root]=a[left];
return ;
}
int mid=(left+right)/2;
build(root*2,left,mid);
build(root*2+1,mid+1,right);
f[root]=max(f[root*2],f[root*2+1]);
return ;
}
void p(int root,int left,int right){
int mid=(left+right)/2;
if(d[root]<1e9){
// cout<<"!";
d[root*2]=d[root];
d[root*2+1]=d[root];
f[root*2]=d[root];
f[root*2+1]=d[root];
g[root*2]=0;
g[root*2+1]=0;
d[root]=1e9+10;
}
if(g[root]!=0){
g[root*2]+=g[root];
g[root*2+1]+=g[root];
f[root*2]+=g[root];
f[root*2+1]+=g[root];
g[root]=0;
}
return ;
}
void f1(int root,int left,int right,int qleft,int qright,int x){
if(left>=qleft&&right<=qright){
f[root]=x;
d[root]=x;
return ;
}
p(root,left,right);
int mid=(left+right)/2;
if(mid>=qright){
f1(root*2,left,mid,qleft,qright,x);
}
else if(mid<qright){
f1(root*2+1,mid+1,right,qleft,qright,x);
}
else{
f1(root*2,left,mid,qleft,mid,x);
f1(root*2+1,mid+1,right,mid+1,qright,x);
}
// cout<<"!";
f[root]=max(f[root*2],f[root*2+1]);
return ;
}
void f2(int root,int left,int right,int qleft,int qright,int x){
if(qleft<=left&&qright>=right){
f[root]+=(right-left+1)*x;
g[root]+=x;
return ;
}
int mid=(left+right)/2;
p(root,left,right);
if(mid>=qright){
f2(root*2,left,mid,qleft,qright,x);
}
else if(mid+1<=qleft){
f2(root*2+1,mid+1,right,qleft,qright,x);
}
else{
f2(2*root,left,mid,qleft,mid,x);
f2(2*root+1,mid+1,right,mid+1,qright,x);
}
f[root]=max(f[root*2],f[root*2+1]);
return ;
}
int f3(int root,int left,int right,int qleft,int qright){
if(left>=qleft&&right<=qright){
return f[root];
}
p(root,left,right);
int mid=(left+right)/2;
if(mid>=qright){
return f3(root*2,left,mid,qleft,qright);
}
else if(mid<qleft){
return f3(root*2+1,mid+1,right,qleft,qright);
}
else{
return max(f3(root*2,left,mid,qleft,mid),f3(root*2+1,mid+1,right,mid+1,qright));
}
}
signed main(){
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
memset(d,0x7f,sizeof(d));
build(1,1,n);
for(int i=1;i<=q;i++){
int h;
scanf("%lld",&h);
if(h==1){
int l,r,x;
scanf("%lld%lld%lld",&l,&r,&x);
f1(1,1,n,l,r,x);
}
else if(h==2){
int l,r,x;
scanf("%lld%lld%lld",&l,&r,&x);
f2(1,1,n,l,r,x);
}
else{
int l,r;
scanf("%lld%lld",&l,&r);
cout<<f3(1,1,n,l,r)<<endl;
}
}
return 0;
}