Dino_chx @ 2023-04-09 17:17:21
除了#1AC了,其他都WA了,请哪位大佬指点一下。十分感谢。
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+7;
struct ST
{
int l,r,sum,mx,lmx,rmx;
}tree[N<<2];
int w[N];
void pushup(ST &rt,ST &ls,ST &rs)
{
rt.sum=ls.sum+rs.sum;
rt.lmx=max(ls.lmx,ls.sum+rs.lmx);
rt.rmx=max(rs.rmx,rs.sum+ls.rmx);
rt.mx=max({ls.mx,rs.mx,ls.rmx+rs.lmx});
return;
}
void pushup(int x)
{
pushup(tree[x],tree[x<<1],tree[x<<1|1]);
return;
}
void build(int x,int l,int r)
{
if(l==r)
{
tree[x]={l,r,w[l],w[l],w[l],w[l]};
return;
}
else
tree[x].l=l,tree[x].r=r;
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
return;
}
void update(int x,int index,int k)
{
if(tree[x].l==index&&tree[x].r==index)
{
tree[x]={index,index,k,k,k,k};
return;
}
int mid=tree[x].l+tree[x].r>>1;
if(x<=mid)
update(x<<1,index,k);
else
update(x<<1|1,index,k);
pushup(x);
return;
}
ST query(int x,int l,int r)
{
if(l<=tree[x].l&&r>=tree[x].r)
return tree[x];
int mid=tree[x].l+tree[x].r>>1;
if(r<=mid)
return query(x<<1,l,r);
else if(l>mid)
return query(x<<1|1,l,r);
else
{
ST left=query(x<<1,l,r),right=query(x<<1|1,l,r),res;
pushup(res,left,right);
return res;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
build(1,1,n);
while(m--)
{
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==1)
{
if(l>r)
swap(l,r);
printf("%d\n",query(1,l,r).mx);
}
else
update(1,l,r);
}
return 0;
}
by diandian2020 @ 2023-04-09 17:21:08
当
by diandian2020 @ 2023-04-09 17:21:40
当然
by chenjunxiu @ 2023-04-09 17:23:11
至少选一个元素@clancysam