Falling_Sakura @ 2023-07-25 19:49:56
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1000;
#define int long long
typedef long long ll;
struct node
{
int l,r;
int max;
ll add,add2=-2147488888883647;
}tr[N<<2];
int n,q;
int a[N];
inline int read()
{
int x=0,y=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-') y=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*y;
}
void pushup(int u)
{
tr[u].max=max(tr[u<<1].max,tr[u<<1|1].max);
}
void pushdown2(int u)
{
if(tr[u].add2!=-2147488888883647)
{
tr[u<<1].max=tr[u].add2;
tr[u<<1].add2=tr[u].add2;
tr[u<<1|1].max=tr[u].add2;
tr[u<<1|1].add2=tr[u].add2;
tr[u<<1].add=tr[u<<1|1].add=0;
tr[u].add2=-2147488888883647;
}
}
void pushdown(int u)
{
if(tr[u].add)
{
pushdown2(u);//先覆盖后加
tr[u<<1].add+=tr[u].add;
tr[u<<1|1].add+=tr[u].add;
tr[u<<1].max+=tr[u].add;
tr[u<<1|1].max+=tr[u].add;
tr[u].add=0;
}
}
void build(int u,int l,int r)
{
tr[u].l=l,tr[u].r=r;
if(l==r)
{
tr[u].max=a[r];
tr[u].add=0;
tr[u].add2=-2147488888883647;
}
else
{
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify_add(int u,int l,int r,int x)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
pushdown2(u);//添加前先覆盖
tr[u].max+=x;
tr[u].add+=x;
}
else
{
pushdown2(u);
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) modify_add(u<<1,l,r,x);
if(r>mid) modify_add(u<<1|1,l,r,x);
pushup(u);
}
}
void modify(int u,int l,int r,int x)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
tr[u].add=0;
tr[u].max=x;
tr[u].add2=x;
}
else
{
pushdown2(u);
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) modify(u<<1,l,r,x);
if(r>mid) modify(u<<1|1,l,r,x);
pushup(u);
}
}
int query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].max;
else
{
int maxn=-0x3fffffffff;
pushdown2(u);
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) maxn=max(maxn,query(u<<1,l,r));
if(r>mid) maxn=max(maxn,query(u<<1|1,l,r));
return maxn;
}
}
signed main()
{
n=read(),q=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
for(int i=1;i<=4*n;i++)
tr[i].add2=-2147488888883647;
build(1,1,n);
int op,l,r,x;
while(q--)
{
op=read();
l=read();
r=read();
if(op==1)
{
x=read();
modify(1,l,r,x);
}
else if(op==2)
{
x=read();
modify_add(1,l,r,x);
}
else
{
printf("%lld\n",query(1,l,r));
}
}
return 0;
}
by Falling_Sakura @ 2023-07-25 19:50:14
why?
by hellomoon @ 2023-08-13 20:01:38
多谢兄台,我也是点10re,没看到你的评论,以我抠搜的性子,可能就10个10个的加空间了,呜
by Falling_Sakura @ 2023-08-14 15:44:45
@hellomoon 但是不知道为什么,奇怪。
by hellomoon @ 2023-08-15 14:48:42
@FallingSakura 可不可能是pushdown那里,已经到l=r的结点了,但是它还是往下给i*2的结点赋值了
by Falling_Sakura @ 2023-08-15 15:05:31
@hellomoon 叶子节点根本就不会pushdown啊
by hellomoon @ 2023-08-15 15:09:33
if(tr[u].l>=l&&tr[u].r<=r) { pushdown2(u);//添加前先覆盖 tr[u].max+=x; tr[u].add+=x; } 这一段代码里,可能进入叶子节点呀
by Falling_Sakura @ 2023-08-15 20:52:56
@hellomoon 你说的有道理,我加了一句判断以后就能过了。