_Firefly__ @ 2024-09-11 22:26:20
#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1
#define int long long
using namespace std;
const int N=1e6+10;
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
struct tree{
int add,xg,mx,used;
}tag[N<<2];
int a[N],n,m;
void pushup(int p){
tag[p].mx=max(tag[lp].mx,tag[rp].mx);
}
void build(int p,int l,int r){
tag[p].mx=-1e18;
if(l==r){
tag[p].mx=a[l];
return ;
}
int mid=l+r>>1;
build(lp,l,mid);
build(rp,mid+1,r);
pushup(p);
}
void pushdown(int p){
if(tag[p].used==0){
tag[lp].add+=tag[p].add;
tag[rp].add+=tag[p].add;
tag[lp].mx+=tag[p].add;
tag[rp].mx+=tag[p].add;
}
else {
tag[lp].xg=tag[p].xg;
tag[rp].xg=tag[p].xg;
tag[lp].add+=tag[p].add;
tag[rp].add+=tag[p].add;
tag[lp].mx=tag[p].xg+tag[p].add;
tag[rp].mx=tag[p].xg+tag[p].add;
tag[lp].used=tag[rp].used=1;
}
tag[p].used=0;
tag[p].add=0;
tag[p].xg=0;
}
void update(int p,int l,int r,int L,int R,int c){
if(l>R||r<L)return;
if(l>=L&&r<=R){
tag[p].add+=c;
tag[p].mx+=c;
return;
}
pushdown(p);
int mid=l+r>>1;
update(lp,l,mid,L,R,c);
update(rp,mid+1,r,L,R,c);
pushup(p);
}
void change(int p,int l,int r,int L,int R,int c){
if(l>R||r<L)return;
if(l>=L&&r<=R){
tag[p].xg=c;
tag[p].mx=c;
tag[p].add=0;
tag[p].used=1;
return;
}
pushdown(p);
int mid=l+r>>1;
change(lp,l,mid,L,R,c);
change(rp,mid+1,r,L,R,c);
pushup(p);
}
int query(int p,int l,int r,int L,int R){
if(l>R||r<L)return -1e18;
if(l>=L&&r<=R){
return tag[p].mx;
}
pushdown(p);
int mid=l+r>>1;
int res=-1e18;
res=max(res,query(lp,l,mid,L,R));
res=max(res,query(rp,mid+1,r,L,R));
return res;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++){
int opt=read(),l=read(),r=read(),x;
if(opt==2){
x=read();
update(1,1,n,l,r,x);
}
else if(opt==1){
x=read();
change(1,1,n,l,r,x);
}
else printf("%lld\n",query(1,1,n,l,r));
}
}
by _Firefly__ @ 2024-09-11 22:27:53
还有一个小问题,我没用used标记直接通过xg是否等于0来判断只有50加了就有60 想知道为什么
by stickman_stickmin @ 2024-09-13 18:41:25
x可能为0
by stickman_stickmin @ 2024-09-13 18:42:39
@_Firefly__ x可能为0
by _Firefly__ @ 2024-09-13 20:42:49
@stickman_stickmin %%%
by _Firefly__ @ 2024-09-19 21:56:02
过了,pushdown修改标记写成+=了 倒是没想到能有60