解析:
记录所有符合的区间,然后前缀和取最大值即可
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=2e5+5;
int n,a[N],sum[N];
void solve(){
scanf("%d",&n);
vector<pair<int,int>>v;
int l=-1,r,p;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
if(l==-1){
l=i,r=i;
if(abs(a[i])%2==0) p=0;
else p=1;
}
else{
int k=abs(a[i])%2;
if(k==p){
v.push_back({l,r});
l=i,r=i,p=k;
}
else{
p=k;
r=i;
}
}
}
if(l!=-1) v.push_back({l,r});
int res=-0x3f3f3f3f;
for(auto it:v){
int l=it.first,r=it.second;
// cout<<l<<" "<<r<<endl;
int minn=0x3f3f3f3f,maxx=-0x3f3f3f3f;
for(int i=l-1;i<=r;i++){
if(i>=l) maxx=max(maxx,sum[i]-minn);
minn=min(minn,sum[i]);
// cout<<minn<<" "<<maxx<<endl;
}
res=max(res,maxx);
}
printf("%d\n",res);
}
signed main(){
int t=1;
scanf("%d",&t);
while(t--) solve();
return 0;
}