Dream_weavers @ 2022-04-10 21:25:54
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f3f;
int n,m,op,l,r,a[N],d;
int t[N<<2],tag[N<<2],mdf[N<<2];
inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}
inline void pushup(int x){
t[x]=max(t[lc(x)],t[rc(x)]);
}
inline void pushdown(int x){
tag[lc(x)]+=tag[x],t[lc(x)]+=tag[x];
tag[rc(x)]+=tag[x],t[rc(x)]+=tag[x];
tag[x]=0;
if(mdf[x]!=INF){
t[lc(x)]=mdf[lc(x)]=mdf[x],tag[lc(x)]=0;
t[rc(x)]=mdf[rc(x)]=mdf[x],tag[rc(x)]=0;
mdf[x]=INF;
}
}
void bulid(int l,int r,int x){
mdf[x]=INF;
if(l==r){
t[x]=a[l];
return ;
}
int mid=(l+r)>>1;
bulid(l,mid,lc(x));
bulid(mid+1,r,rc(x));
pushup(x);
}
void update(int L,int R,int l,int r,int x,int d){
if(l>=L&&r<=R){
t[x]=mdf[x]=d;
tag[x]=0;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid) update(L,R,l,mid,lc(x),d);
if(mid+1<=R) update(L,R,mid+1,r,rc(x),d);
pushup(x);
}
void add(int L,int R,int l,int r,int x,int d){
if(l>=L&&r<=R){
t[x]+=d,tag[x]+=d;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid) update(L,R,l,mid,lc(x),d);
if(mid<R) update(L,R,mid+1,r,rc(x),d);
pushup(x);
}
int query(int L,int R,int l,int r,int x){
if(l>=L&&r<=R)return t[x];
pushdown(x);
int mid=(r+l)>>1;
int ans=-INF;
if(L<=mid) ans=max(ans,query(L,R,l,mid,lc(x)));
if(mid<R) ans=max(ans,query(L,R,mid+1,r,rc(x)));
return ans;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
bulid(1,n,1);
while(m--){
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1){
scanf("%lld",&d);
update(l,r,1,n,1,d);
}else if(op==2){
scanf("%lld",&d);
add(l,r,1,n,1,d);
}else{
printf("%lld\n",query(l,r,1,n,1));
}
}
return 0;
}
by TheSky233 @ 2022-04-10 21:35:06
这个帖子可能有点帮助qwq
by TheSky233 @ 2022-04-10 21:36:59
线段树一生之敌
by hrgd @ 2022-04-10 21:40:45
@Dream_weavers 你把 add 函数最上面一段改成:
if(l>=L&&r<=R){
t[x]+=d;
if(mdf[x]==INF)tag[x]+=d;
else mdf[x]+=d;
return;
}
by hrgd @ 2022-04-10 21:41:43
@TheSky233 孩子,别着急,往后你的一生之敌还多着。
by ningago @ 2022-04-10 21:43:44
@Dream_weavers
应该是先下传修改在下传增加吧,不然如果两个都有就增加无效了,tag[lson],tag[rson]成0了
by Dream_weavers @ 2022-04-10 21:47:47
@hrgd @ningago 改了没变
by Dream_weavers @ 2022-04-10 21:55:48
我放一个云剪贴板吧,能实时更新link
by ningago @ 2022-04-10 21:55:51
@Dream_weavers
emm,你add里面分治的递归写成update了
by Dream_weavers @ 2022-04-10 21:57:01
@ningago 谢谢大佬们,已经AC了
我tm怎么天天犯低级错误啊