LDY_ @ 2024-07-21 12:22:53
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
using namespace std;
int n,q;
int a[2000005];
struct Tree{
int l,r,siz;
int ad,cov;
int maxx;
}t[8000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void pushup(int x){
t[x].maxx=max(t[ls(x)].maxx,t[rs(x)].maxx);
}
void build(int x,int l,int r){
t[x].l=l;t[x].r=r;t[x].siz=r-l+1;
t[x].ad=0;t[x].cov=-inf;
if(l==r){
t[x].maxx=a[l];
return;
}
int mid=(l+r)/2;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
pushup(x);
}
void pushdown(int x){
if(t[x].cov!=-inf){
t[ls(x)].cov=t[x].cov;
t[rs(x)].cov=t[x].cov;
t[ls(x)].ad=t[x].ad;
t[rs(x)].ad=t[x].ad;
t[ls(x)].maxx=t[x].ad+t[x].cov;
t[ls(x)].maxx=t[x].ad+t[x].cov;
}
else{
t[ls(x)].ad+=t[x].ad;
t[rs(x)].ad+=t[x].ad;
t[ls(x)].maxx+=t[x].ad;
t[rs(x)].maxx+=t[x].ad;
}
t[x].cov=-inf;t[x].ad=0;
}
void add(int x,int ll,int rr,int k){
if(t[x].l>rr||t[x].r<ll) return;
if(t[x].l>=ll&&t[x].r<=rr){
t[x].ad+=k;
t[x].maxx+=k;
return;
}
pushdown(x);
add(ls(x),ll,rr,k);
add(rs(x),ll,rr,k);
pushup(x);
}
void cover(int x,int ll,int rr,int k){
if(t[x].l>rr||t[x].r<ll) return;
if(t[x].l>=ll&&t[x].r<=rr){
t[x].ad=0;
t[x].cov=k;
t[x].maxx=k;
return;
}
pushdown(x);
cover(ls(x),ll,rr,k);
cover(rs(x),ll,rr,k);
pushup(x);
}
int query(int x,int ll,int rr){
if(t[x].l>rr||t[x].r<ll) return -inf;
if(t[x].l>=ll&&t[x].r<=rr) return t[x].maxx;
pushdown(x);
return max(query(ls(x),ll,rr),query(rs(x),ll,rr));
}
signed main(){
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
int opt,l,r,x;
while(q--){
scanf("%lld",&opt);
if(opt==1){
scanf("%lld%lld%lld",&l,&r,&x);
cover(1,l,r,x);
}
if(opt==2){
scanf("%lld%lld%lld",&l,&r,&x);
add(1,l,r,x);
}
if(opt==3){
scanf("%lld%lld",&l,&r);
cout<<query(1,l,r)<<endl;
}
}
return 0;
}
by dci66666 @ 2024-07-22 20:23:09
巧了,这题我也没过(
by ZZ_WYZ @ 2024-11-28 21:34:38
%%%