代码:
#include<bits/stdc++.h>
#define mid(l,r) (l+r)>>1
#define lc(a) a<<1
#define rc(a) a<<1|1
#define MAXN 50005
//#define max(a,b) a>b?a:b
#define forr(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
int a[MAXN*2];
typedef struct Segment_Tree{
int les,res;
int ans,val;
}Tree;
Tree tree[MAXN*4];
void update(int i){
Tree l=tree[lc(i)],r=tree[rc(i)];
tree[i].val=l.val+r.val;
tree[i].les=max(l.les,l.val+r.les);
tree[i].res=max(r.res,r.val+l.res);
tree[i].ans=max(l.res+r.les,max(l.ans,r.ans));
}
void build(int i,int l,int r){
if(l==r){
tree[i].ans=tree[i].les=tree[i].res=tree[i].val=a[l];
return;
}
int mid=mid(l,r);
build(lc(i),l,mid);
build(rc(i),mid+1,r);
update(i);
}
void Change(int p,int i,int l,int r,int val){
if(l==r){
tree[i].ans=tree[i].les=tree[i].res=tree[i].val=val;
return;
}
int mid=mid(l,r);
if(p<=mid){
Change(p,lc(i),l,mid,val);
}
else Change(p,rc(i),mid+1,r,val);
update(i);
}
Tree query(int i,int l,int r,int x,int y){
if(x<=l&&y>=r){
return tree[i];
}
int mid=mid(l,r);
if(y<=mid){
return query(lc(i),l,mid,x,y);
}
if(x>mid){
return query(rc(i),mid+1,r,x,y);
}
Tree L=query(lc(i),l,mid,x,y);
Tree R=query(rc(i),mid+1,r,x,y);
Tree Ans;
Ans.val=L.val+R.val;
Ans.les=max(L.les,L.val+R.les);
Ans.res=max(R.res,R.val+L.res);
Ans.ans=max(L.res+R.les,max(L.ans,R.ans));
return Ans;
}
int n,m;
int main(){
scanf("%d",&n);
forr(i,1,n){
scanf("%d",&a[i]);
}
build(1,1,n);
scanf("%d",&m);
forr(i,1,m){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==0){
Change(x,1,1,n,y);
}
else{
printf("%d\n",query(1,1,n,x,y).ans);
}
}
}
一直WA
感觉像是 update
出了问题