没有spoj的账号求dalao帮交一下0^0
#include<bits/stdc++.h>
#define lot long
using namespace std;
const int N=5e5+10;
struct st{
int l,r;
int sum,lmax,rmax,data;
}t[N<<2];
int a[N];
inline int read(){
int XX=0,FF=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
FF*=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
XX=XX*10+ch-48;
ch=getchar();
}
return XX*FF;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
return ;
}
void push_up(st &u,st &l,st &r){
u.sum=l.sum+r.sum;
u.lmax=max(l.lmax,l.sum+r.lmax);
u.rmax=max(r.rmax,r.sum+l.rmax);
u.data=max(max(l.data,r.data),l.rmax+r.lmax);
return ;
}
void push_up(int rt){
push_up(t[rt],t[rt<<1],t[rt<<1|1]);
}
void build(int rt,int l,int r){
t[rt].l=l;
t[rt].r=r;
if(l==r){
t[rt]={l,r,a[r],a[r],a[r],a[r]};
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
push_up(rt);
return ;
}
st ask(int rt,int l,int r){
if(t[rt].l>=l&&t[rt].r<=r){
return t[rt];
}
int mid=(t[rt].l+t[rt].r)>>1;
if(r<=mid)return ask(rt<<1,l,r);
else if(l>mid)return ask(rt<<1|1,l,r);
else{
st lans=ask(rt<<1,l,r),rans=ask(rt<<1|1,l,r),ans;
push_up(ans,lans,rans);
return ans;
}
}
int n,m;
int main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
m=read();
while(m--){
int x=read(),y=read();
if(x>y)swap(x,y);
write(ask(1,x,y).data);
printf("\n");
}
return 0;
}