始终找不到自己哪里错了,麻烦各位巨佬能指点一下吗
#include<iostream>
#include<cstdio>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int maxn=10000+10;
int T,n,q;
int a[maxn];
int x1,x2,Y1,y2;
struct Tree{
int l,r;
int val,sum;
int lmx,rmx;
}t[maxn<<3];
inline int read(void){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void push_up(int p){
int ls=p<<1,rs=p<<1|1;
t[p].sum=t[ls].sum+t[rs].sum;
t[p].lmx=max(t[ls].lmx,t[ls].sum+t[rs].lmx);
t[p].rmx=max(t[rs].rmx,t[rs].sum+t[ls].rmx);
t[p].val=max(t[rs].lmx+t[ls].rmx,max(t[ls].val,t[rs].val));
}
inline void build(int p,int L,int R){
t[p].sum=0;
t[p].l=L,t[p].r=R;
t[p].lmx=t[p].rmx=t[p].val=0;
if(L==R){
t[p].sum=t[p].lmx=t[p].rmx=t[p].val=a[L];
return;
}
int mid=(L+R)>>1;
build(p<<1,L,mid),build(p<<1|1,mid+1,R);
push_up(p);
}
inline Tree query(int p,int L,int R){
if(L>R){
return (Tree){0,0,0,0,0,0};
}
int ls=p<<1,rs=p<<1|1;
if(L<=t[p].l&&R>=t[p].r){
return t[p];
}
int mid=(t[p].l+t[p].r)>>1;
if(L>mid)return query(rs,L,R);
if(R<=mid)return query(ls,L,R);
Tree ans,lsn,rsn;
lsn=query(ls,L,mid),rsn=query(rs,mid+1,R);
ans.sum=lsn.sum+rsn.sum;
ans.lmx=max(lsn.lmx,lsn.sum+rsn.lmx);
ans.rmx=max(rsn.rmx,rsn.sum+lsn.rmx);
ans.val=max(lsn.rmx+rsn.lmx,max(lsn.val,rsn.val));
return ans;
}
int main(){
T=read();
while(T--){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,1,n);
q=read();
for(int i=1;i<=q;i++){
int ans=0;
x1=read(),Y1=read();
x2=read(),y2=read();
if(Y1<x2){
Tree mid,lsn,rsn;
mid=query(1,Y1+1,x2-1);
lsn=query(1,x1,Y1),rsn=query(1,x2,y2);
ans=lsn.rmx+mid.sum+rsn.lmx;
}else{
ans=query(1,x2,Y1).val;
if(x1<x2)ans=max(ans,query(1,x1,Y1).rmx+query(1,Y1,y2).lmx-a[Y1]);
if(y2>Y1)ans=max(ans,query(1,x1,x2).rmx+query(1,x2,y2).lmx-a[x2]);
}
printf("%d\n",ans);
}
}
return 0;
}