题面: 给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一:
2xy,把 A[x] 改成 y。
1xy,查询区间 [x,y] 中的最大连续子段和。
对于每个询问,输出一个整数表示答案。 这是我的代码,想知道为什么错了,用的线段树
#include<bits/stdc++.h>
#define MAXN 500010
using namespace std;
struct seg{
long long max_right;
long long max_left;
long long max_now;
long long r,l,sum;
};
long long a[MAXN];
seg tree[MAXN*4];
long long n,m;
long long type,x,y;
void up(long long now){
tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
tree[now].max_left=max(tree[now*2].max_left,tree[now*2].sum+tree[now*2+1].max_left);
tree[now].max_right=max(tree[now*2+1].max_right,tree[now*2+1].sum+tree[now*2].max_right);
tree[now].max_now=max(tree[now*2+1].max_left+tree[now*2].max_right,max(tree[now*2].max_now,tree[now*2+1].max_now));
}
void update(long long now,long long x,long long y){
long long l=tree[now].l,r=tree[now].r,mid=(l+r)/2;
if(l==r){
tree[now].sum=tree[now].max_left=tree[now].max_right=tree[now].max_now=y;
return ;
}
if(l==x&&l==r){
tree[now].sum=tree[now].max_left=tree[now].max_right=tree[now].max_now=y;
up(now);
return ;
}
if(x<=mid){
update(now*2,x,y);
}else{
update(now*2+1,x,y);
}
up(now);
}
void build(long long now,long long l,long long r){
tree[now].l=l;tree[now].r=r;
long long mid=(r+l)/2;
if(l==r){
tree[now].sum=tree[now].max_left=tree[now].max_right=tree[now].max_now=a[l];
return ;
}
build(now*2,l,mid);
build(now*2+1,mid+1,r);
up(now);
}
seg query(long long now,long long x,long long y){
long long l=tree[now].l,r=tree[now].r,mid=(l+r)/2;
if(l==r){
return tree[now];
}
if(x==l&&y==r){
return tree[now];
}
if(y<=mid){
return query(now*2,x,y);
}else if(x>mid){
return query(now*2+1,x,y);
}else{
seg u,v,w;
u=query(now*2,x,mid);
v=query(now*2+1,mid+1,y);
w.sum=u.sum+v.sum;
w.max_left=max(u.max_now,u.sum+v.max_left);
w.max_right=max(v.max_now,v.sum+u.max_right);
w.max_now=max(u.max_right+v.max_left,max(u.max_now,v.max_now));
return w;
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(m--){
scanf("%lld%lld%lld",&type,&x,&y);
if(type==1){
if(x>y) swap(x,y);
printf("%lld\n",query(1,x,y).max_now);
}else{
update(1,x,y);
}
}
}