zhangzhihao2 @ 2023-10-21 11:46:58
马上上CSP-S考场了,救命!
#include<bits/stdc++.h>
#define int long long
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
const int inf=-1145141919810;
int n,q,arr[1000009],sum[4000009],maxt[4000009],stag[4000009],ctag[4000009];
void pushup(int x){
maxt[x]=max(maxt[ls],maxt[rs]);
}
void fs(int x,int l,int r,int k){
stag[x]+=k;
maxt[x]+=k;
}
void fc(int x,int l,int r,int k){
stag[x]=0;
ctag[x]=k;
maxt[x]=k;
}
void pushdownc(int x,int l,int r){
if(ctag[x]==inf) return;
stag[ls]=stag[rs]=0;
maxt[ls]=maxt[rs]=ctag[ls]=ctag[rs]=ctag[x];
ctag[x]=inf;
}
void pushdowns(int x,int l,int r){
if(!stag[x]) return;
pushdownc(x,l,r);
stag[ls]+=stag[x],stag[rs]+=stag[x];
maxt[ls]+=stag[x],maxt[rs]+=stag[x];
stag[x]=0;
}
void pushdown(int x,int l,int r){
pushdownc(x,l,r),pushdowns(x,l,r);
}
void build(int x,int l,int r){
if(l==r){
maxt[x]=arr[l],ctag[x]=inf;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(x);
}
void add(int x,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
pushdownc(x,l,r);
fs(x,l,r,k);
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(mid>=ql) add(ls,l,mid,ql,qr,k);
if(mid<qr) add(rs,mid+1,r,ql,qr,k);
pushup(x);
}
void cover(int x,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
fc(x,l,r,k);
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(mid>=ql) cover(ls,l,mid,ql,qr,k);
if(mid<qr) cover(rs,mid+1,r,ql,qr,k);
pushup(x);
}
int query(int x,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return maxt[x];
pushdown(x,l,r);
int mid=(l+r)>>1,res=-1e15;
if(mid>=ql) res=max(res,query(ls,l,mid,ql,qr));
if(mid<qr) res=max(res,query(rs,mid+1,r,ql,qr));
pushup(x);
return res;
}
int ll,rr,xx;
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++) scanf("%lld",&arr[i]);
build(1,1,n);
for(int i=1;i<=n*4;i++) ctag[i]=inf;
for(int i=1;i<=q;i++){
int op,l,r,x;
cin>>op;
if(op==1){
scanf("%lld%lld%lld",&ll,&rr,&xx);
cover(1,1,n,ll,rr,xx);
// for(int i=1;i<=n;i++){
// cout<<query(1,1,n,i,i)<<' ';
// }
// cout<<endl;
}
else if(op==2){
scanf("%lld%lld%lld",&ll,&rr,&xx);
add(1,1,n,ll,rr,xx);
// for(int i=1;i<=n;i++){
// cout<<query(1,1,n,i,i)<<' ';
// }
// cout<<endl;
}
else{
scanf("%lld%lld",&ll,&rr);
cout<<query(1,1,n,ll,rr)<<endl;
}
}
return 0;
}