需要维护的是最大和只能是 max(max(Nodes[now<<1],Nodes[now<<1|1],Nodes[now].rmax+Nodes[now<<1|1].lmax)
所以我们要维护的是lmax,rmax,max,sum四个信息
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
#define LL long long
#define Now int now,int l,int r
#define Mid int mid = (l+r)>>1
#define lson now<<1,l,mid
#define rson now<<1|1,mid+1,r
#define root 1,1,N
const int INF = 0x3f3f3f3f;
const int maxn = 50000+10;
struct Info{
int lmax,rmax,sum,value;
Info(){
lmax = rmax = value = -INF;
sum = 0;
}
void maintain(int x){
lmax = rmax = sum = value = x;
}
};
Info operator + (const Info & a,const Info & b){
Info ret;
ret.lmax = max(a.lmax,a.sum+b.lmax);
ret.rmax = max(b.rmax,a.rmax+b.sum);
ret.sum = a.sum+b.sum;
ret.value = max(max(a.value,b.value),a.rmax+b.lmax);
return ret;
}
Info Nodes[maxn<<2];
void update(Now,int pos,int val){
if(l == r){
Nodes[now].maintain(val);
return;
}
Mid;
if(pos <= mid)
update(lson,pos,val);
else
update(rson,pos,val);
Nodes[now] = Nodes[now<<1]+Nodes[now<<1|1];
}
Info query(Now,int ql,int qr){
Info ret;
if(ql <= l && r <= qr){
return Nodes[now];
}
Mid;
if(ql <= mid)
ret = ret + query(lson,ql,qr);
if(qr > mid)
ret = ret + query(rson,ql,qr);
return ret;
}
int main(){
ios::sync_with_stdio(false);
int N,M,x,ql,qr;
while(cin>>N){
for(int i = 1; i <= N; i++){
cin>>x;
update(root,i,x);
}
cin>>M;
while(M--){
cin>>ql>>qr;
cout<<query(root,ql,qr).value<<endl;
}
}
return 0;
}