样例可过,但炸了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
const int maxn=5e4+5;
int a[maxn],sum[maxn<<2],sum_l[maxn<<2],sum_r[maxn<<2],sum_m[maxn<<2],ans,cnt;
void push_up(int k){
sum[k]=sum[k<<1]+sum[k<<1|1];
sum_l[k]=max(sum_l[k<<1],sum_r[k<<1]+sum[k<<1]);
sum_r[k]=max(sum[k<<1|1]+sum_r[k<<1],sum_r[k<<1|1]);
sum_m[k]=max(max(sum_m[k<<1],sum_m[k<<1|1]),sum_l[k<<1|1]+sum_r[k<<1]);
}
void buildtree(int k,int l,int r){
if(l==r){
sum[k]=sum_l[k]=sum_r[k]=sum_m[k]=a[l];
return ;
}
int m=(l+r)>>1;
buildtree(k<<1,l,m);
buildtree(k<<1|1,m+1,r);
push_up(k);
}
void query(int k,int l,int r,int x,int val){
if(l==r){
sum[k]=val;
sum_l[k]=val;
sum_r[k]=val;
sum_m[k]=val;
return ;
}
int m=(l+r)>>1;
if(x<=m){
query(k<<1,l,m,x,val);
}
if(x>=m+1){
query(k<<1|1,m+1,r,x,val);
}
push_up(k);
}
void query_sum(int k,int l,int r,int x,int y){
if(x<=l&&y>=r){
ans=max(ans,sum_m[k]);
ans=max(ans,cnt+sum_l[k]);
cnt=max(sum_r[k],cnt+sum[k]);
return ;
}
int m=(l+r)>>1;
int ans=0;
if(x<=m){
query_sum(k<<1,l,m,x,y);
}
if(y>=m+1){
query_sum(k<<1|1,m+1,r,x,y);
}
return ;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
buildtree(1,1,n);
cin>>q;
while(q--){
int opt,l,r;
cin>>opt>>l>>r;
if(opt==0){
query(1,1,n,l,r);
}
else{
ans=cnt=-1e18;
query_sum(1,1,n,l,r);
cout<<ans<<'\n';
}
}
return 0;
}