入门题,会 a+b 的都会做,帮我调一下,样例过不去qwq
初步诊断为区间有交集情况写挂了/qd
#include<bits/stdc++.h>
using namespace std;
long long n,q,a[10005],T;
struct Tree{
long long l,r,ans,sum;
}tree[40005];
inline Tree push_up(Tree l,Tree r){
Tree zxc;
zxc.sum=l.sum+r.sum;
zxc.l=max(l.l,l.sum+r.l);
zxc.r=max(r.r,r.sum+l.r);
zxc.ans=max(l.r+r.l,max(l.ans,r.ans));
return zxc;
}
inline void build(long long l,long long r,long long p){
if(l==r){
tree[p].ans=a[l];
tree[p].l=a[l];
tree[p].r=a[l];
tree[p].sum=a[l];
return;
}
long long mid=(l+r)/2;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
push_up(tree[p*2],tree[p*2+1]);
return;
}
inline Tree query_max(long long nl,long long nr,long long l,long long r,long long p){
if(l>nr||r<nl){
return (Tree){0,0,0,0};
}
if(l>=nl&&r<=nr){
return tree[p];
}
long long mid=(l+r)/2;
if(nr<=mid){
return query_max(nl,nr,l,mid,p*2);
}
if(nl>mid){
return query_max(nl,nr,mid+1,r,p*2+1);
}
else{
return push_up(query_max(nl,nr,l,mid,p*2),query_max(nl,nr,mid+1,r,p*2+1));
}
}
inline long long query(long long l1,long long r1,long long l2,long long r2,long long l,long long r,long long p){
if(r1<l2){
return query_max(l1,r1,l,r,p).r+query_max(r1+1,l2-1,l,r,p).sum+query_max(l2,r2,l,r,p).l;
}
long long ans=query_max(l2,r1,l,r,p).ans;
if(l1<l2){
ans=max(ans,query_max(l1,r2,l,r,p).r+query_max(l2,r2,l,r,p).l-a[l2]);
}
if(r1<r2){
ans=max(ans,query_max(l1,r1,l,r,p).r+query_max(r1,r2,l,r,p).l-a[r1]);
}
return ans;
}
int main(){
cin>>T;
while(T--){
memset(tree,0,sizeof(tree));
cin>>n;
long long x1,y1,x2,y2;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
cin>>q;
while(q--){
cin>>x1>>y1>>x2>>y2;
cout<<query(x1,y1,x2,y2,1,n,1)<<endl;
}
}
}
/*
1
6
3 -2 1 -4 5 2
1
1 3 2 5
ans :
*/