http://www.spoj.com/problems/GSS1/
My Code
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 #define maxn 50010 7 struct node 8 { 9 int lmax,rmax,max,sum; 10 }setree[maxn<<2]; 11 int ans; 12 void pushup(int rt) 13 { 14 setree[rt].lmax=max(setree[rt<<1].lmax,setree[rt<<1].sum+setree[rt<<1|1].lmax); 15 16 setree[rt].rmax=max(setree[rt<<1|1].rmax,setree[rt<<1|1].sum+setree[rt<<1].rmax); 17 18 setree[rt].sum=setree[rt<<1].sum+setree[rt<<1|1].sum; 19 20 setree[rt].max=max(setree[rt<<1].max,setree[rt<<1|1].max); 21 setree[rt].max=max(setree[rt].max,setree[rt<<1].rmax+setree[rt<<1|1].lmax); 22 } 23 void build(int l,int r,int rt) 24 { 25 if(l==r){ 26 scanf("%d",&setree[rt].sum); 27 setree[rt].lmax=setree[rt].sum; 28 setree[rt].rmax=setree[rt].sum; 29 setree[rt].max=setree[rt].sum; 30 return; 31 } 32 int m=(l+r)>>1; 33 build(lson); 34 build(rson); 35 pushup(rt); 36 } 37 int query(int l,int r,int rt,int flag,int L,int R) 38 { 39 if(L==l&&r==R){ 40 ans=max(ans,setree[rt].max); 41 return flag==-1?setree[rt].lmax:setree[rt].rmax; 42 } 43 int m=(l+r)>>1; 44 if(R<=m) 45 return query(lson,-1,L,R); 46 else if(L>m) 47 return query(rson,1,L,R); 48 else{ 49 int ln=query(lson,1,L,m); 50 int rn=query(rson,-1,m+1,R); 51 ans=max(ans,ln+rn); 52 if(flag == -1) 53 return max(setree[rt<<1].lmax, setree[rt<<1].sum + rn); 54 else 55 return max(setree[rt<<1|1].rmax, setree[rt<<1|1].sum + ln); 56 57 } 58 return ans; 59 } 60 int main() 61 { 62 int n; 63 while(~scanf("%d",&n)){ 64 build(1,n,1); 65 int m; 66 scanf("%d",&m); 67 while(m--){ 68 int a,b; 69 ans=-(1<<30); 70 scanf("%d%d",&a,&b); 71 int tmp=query(1,n,1,0,a,b); 72 printf("%d\n",ans); 73 } 74 } 75 return 0; 76 }