#include #include #include #include namespace mp = boost::multiprecision; using Bint = mp::cpp_int; using namespace std; using namespace atcoder; #define rep(i, n) for(int i=0;i<(n);++i) #define rep1(i, n) for(int i=1;i<=(n);i++) #define ll long long using mint = modint998244353; using P = pair; using lb = long double; using T = tuple; #ifdef LOCAL # include # define dbg(...) debug_print::multi_print(#__VA_ARGS__, __VA_ARGS__) #else # define dbg(...) (static_cast(0)) #endif // Coodinate Compression // https://youtu.be/fR3W5IcBGLQ?t=8550 template struct CC { bool initialized; vector xs; CC(): initialized(false) {} void add(T x) { xs.push_back(x);} void init() { sort(xs.begin(), xs.end()); xs.erase(unique(xs.begin(),xs.end()),xs.end()); initialized = true; } int operator()(T x) { if (!initialized) init(); return upper_bound(xs.begin(), xs.end(), x) - xs.begin() - 1; } T operator[](int i) { if (!initialized) init(); return xs[i]; } int size() { if (!initialized) init(); return xs.size(); } }; ll op(ll a, ll b) { return max(a,b); } ll e() { return -1e18; } ll op2(ll a, ll b) { return min(a,b); } ll e2() { return 1e18; } int main() { int t; cin >> t; while(t--) { int n; cin >> n; vector a(n); rep(i,n) cin >> a[i]; vector s(n+1); rep(i,n) s[i+1] = s[i] + a[i]; vector> vs; CC cc; rep(i,n+1) cc.add(s[i]); int m = cc.size(); segtree maxseg(m); segtree minseg(m); ll ans = 0; maxseg.set(cc(s[n-1]),s[n-1]); minseg.set(cc(s[n-1]),s[n-1]); for(int i=n-2;i>=1;i--) { int x1 = cc(s[i]); int xn = cc(s[n]); if(x1xn && maxseg.prod(xn, x1+1)!=-1e18) ans = max(ans, s[i]-s[n]+abs(s[i])); ll v1 = maxseg.prod(max(x1,xn),m); ll v2 = minseg.prod(0, min(x1,xn)+1); ans = max(ans, 2*v1-s[i]-s[n]+abs(s[i])); ans = max(ans, s[n]+s[i]-2*v2+abs(s[i])); maxseg.set(x1,max(maxseg.get(x1) ,s[i])); minseg.set(x1,min(minseg.get(x1), s[i])); dbg(ans); } cout << ans << endl; } return 0; }