rt,每次编译失败时都会跳到其他界面,没有指出代码里的错误,感觉像是变量重复了,但是我也找不到,求大佬帮忙看看。
#include<iostream>
using namespace std;
struct Node{
int dat,lmax,rmax,sum,l,r;
#define s(x) tr[x].sum
#define lm(x) tr[x].lmax
#define rm(x) tr[x].rmax
#define v(x) tr[x].dat
#define l(x) tr[x].l
#define r(x) tr[x].r
}tr[200001];
int val[200001];
void build(int x,int l,int r){
l(x)=l;
r(x)=r;
if(l==r){
s(x)=val[l];
lm(x)=s(x);
rm(x)=s(x);
v(x)=s(x);
return;
}
int mid=(r+l)>>1;
build(2*x,l,mid);
build(2*x+1,mid+1,r);
s(x)=s(2*x)+s(2*x+1);
lm(x)=max(lm(2*x),s(2*x)+lm(2*x+1));
rm(x)=max(rm(2*x+1),s(2*x+1)+rm(2*x));
v(x)=max(max(v(2*x),v(2*x+1)),lm(2*x+1),rm(2*x));
}
void change(int x,int num,int v){
if(l(x)==r(x)){
s(x)=v;
lm(x)=v;
rm(x)=v;
v(x)=v;
return;
}
int mid=(l(x)+r(x))>>1;
if(num<=mid) change(2*x,num,v);
else change(2*x+1,num,v);
s(x)=s(2*x)+s(2*x+1);
lm(x)=max(lm(2*x),s(2*x)+lm(2*x+1));
rm(x)=max(rm(2*x+1),s(2*x+1)+rm(2*x));
v(x)=max(max(v(2*x),v(2*x+1)),lm(2*x+1),rm(2*x));
}
Node query(int x,int l,int r){
if(l(x)>=l && r(x)<=r)return tr[x];
int mid=(l(x)+r(x))>>1;
if(r<=mid) return query(2*x,l,r);
else if(l>mid) return query(2*x+1,l,r);
Node L=query(2*x,l,r),R=query(2*x+1,l,r);
Node tmp;
tmp.l=0;
tmp.r=0;
tmp.sum=L.sum+R.sum;
tmp.lmax=max(L.lmax,L.sum+R.lmax);
tmp.rmax=max(R.rmax,R.sum+L.rmax);
tmp.dat=max(max(L.dat,R.dat),R.lmax+L.rmax);
return tmp;
}
int main(){
int n,q,opt,x,y;
cin>>n;
for(int i=1;i<=n;i++) cin>>val[i];
build(1,1,n);
cin>>q;
for(int i=1;i<=n;i++){
cin>>opt>>x>>y;
if(!opt)change(1,x,y);
else cout<<(query(1,x,y).dat);
}
}