RT.
题目是过了,但似乎用了什么c++98不支持的东西。。
求大佬帮忙查错qwq
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define lc (rt<<1)
#define rc ((rt<<1)|1)
int n,q;
int sg[N<<2],mx[N<<2],lmx[N<<2],rmx[N<<2];
int a[N];
void pushup(int rt){
sg[rt]=sg[lc]+sg[rc];
lmx[rt]=max(lmx[lc],sg[lc]+lmx[rc]);
rmx[rt]=max(rmx[rc],sg[rc]+rmx[lc]);
mx[rt]=max(max(mx[lc],mx[rc]),lmx[rc]+rmx[lc]);
}
void build(int rt,int l,int r){
if(l==r){
sg[rt]=mx[rt]=lmx[rt]=rmx[rt]=a[l];
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int x,int y){
if(l==r){
sg[rt]=mx[rt]=lmx[rt]=rmx[rt]=y;
return;
}
int mid=(l+r)>>1;
if(x<=mid)update(lc,l,mid,x,y);
else update(rc,mid+1,r,x,y);
pushup(rt);
}
struct data{
int mx,lmx,rmx,sg;
};
data query(int rt,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return (data){mx[rt],lmx[rt],rmx[rt],sg[rt]};
int mid=(l+r)>>1;
if(ql<=mid&&mid<qr){
data ret=(data){0,0,0,0};
data ll=query(lc,l,mid,ql,qr),rr=query(rc,mid+1,r,ql,qr);
ret={max(max(ll.mx,rr.mx),ll.rmx+rr.lmx),max(ll.lmx,ll.sg+rr.lmx),max(rr.rmx,rr.sg+ll.rmx),ll.sg+rr.sg};
return ret;
}else if(ql<=mid){
return query(lc,l,mid,ql,qr);
}else{
return query(rc,mid+1,r,ql,qr);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
scanf("%d",&q);
build(1,1,n);
for(int i=1;i<=q;i++){
int code,a,b;
scanf("%d%d%d",&code,&a,&b);
if(code==0){
update(1,1,n,a,b);
}else{
printf("%d\n",query(1,1,n,a,b).mx);
}
}
return 0;
}