银杉水杉秃杉 @ 2020-12-04 12:32:11
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m;
int a[N];
struct node
{
int sum,maxx,lmax,rmax;
}tree[N<<2];
void pushup(node rt,const node &ls,const node &rs)
{
rt.sum=ls.sum+rs.sum;
rt.maxx=max(max(ls.maxx,rs.maxx),ls.rmax+rs.lmax);
rt.lmax=max(ls.lmax,ls.sum+rs.lmax);
rt.rmax=max(rs.rmax,rs.sum+ls.rmax);
}
void build(int k,int l,int r)
{
if (l==r)
{
tree[k].sum=tree[k].lmax=tree[k].rmax=tree[k].maxx=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(tree[k],tree[k<<1],tree[k<<1|1]);
}
void change(int k,int l,int r,int x,int z)
{
if (l==r)
{
tree[k].sum=tree[k].maxx=tree[k].lmax=tree[k].rmax=z;
return;
}
int mid=(l+r)>>1;
if (x<=mid)
change(k<<1,l,mid,x,z);
if (x>mid)
change(k<<1|1,mid+1,r,x,z);
pushup(tree[k],tree[k<<1],tree[k<<1|1]);
}
node ask(int k,int l,int r,int x,int y)
{
if (x<=l&&y>=r)
return tree[k];
int mid=(l+r)>>1;
if (x<=mid&&y>mid)
{
node res,ls=ask(k<<1,l,mid,x,y),rs=ask(k<<1|1,mid+1,r,x,y);
pushup(res,ls,rs);
return res;
}
if (x<=mid)
return ask(k<<1,l,mid,x,y);
if (y>mid)
return ask(k<<1|1,mid+1,r,x,y);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
int w,x,y;
while (m--)
{
scanf("%d%d%d",&w,&x,&y);
if (w==1)
{
if (x>y)
swap(x,y);
printf("%d\n",ask(1,1,n,x,y).maxx);
}
else
change(1,1,n,x,y);
}
return 0;
}
自己研究了一下应该是pushup函数出了问题,但不知道问题是什么。搞了一天了,求救!
by ixRic @ 2020-12-04 12:35:58
pushup
里面的 rt
要引用
by Ryo_Yamada @ 2020-12-04 12:46:15
@银杉水杉秃杉 rt 要引用,ls 和 rs 不用
by momentous @ 2020-12-04 12:53:19
void pushup(node rt,const node &ls,const node &rs)
改成
void pushup(node &rt,const node &ls,const node &rs)
by 银杉水杉秃杉 @ 2020-12-04 14:25:08
@BreezeEnder 谢谢
by 银杉水杉秃杉 @ 2020-12-04 14:25:33
@ixRic 谢谢
by 银杉水杉秃杉 @ 2020-12-04 14:25:50
@lyslys 谢谢