#ifndef ONLINE_JUDGE #define _GLIBCXX_DEBUG #endif #include #include #include #include using namespace std; using namespace atcoder; using namespace __gnu_pbds; using ll = long long; using mint=modint998244353; using ld = long double; const ll infl = 1LL << 60; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const vector dx = {1, 0, -1, 0}; const vector dy = {0, 1, 0, -1}; template using vc = vector; template using vvc = vc>; template using vvvc = vc>; using vi = vc; using vvi = vvc; using vl = vc; using vvl = vvc; using vvvl = vvc; using vvvvl = vvc; using vs = vc; using vvs = vvc; using P = pair; #define nrep(i,n) for (ll i = 0; i < (n); ++i) #define nfor(i,s,n) for(ll i=s;i using pq = priority_queue>;//★大きい順に取り出す コスト,頂点 bfs系で使う 小さい順じゃないですABC305E template using pq_g = priority_queue, greater>;//小さい順に取り出す ダイクストラ法で使う // 単なるcout関数 template void print(const T& n) { cout << n << "\n"; } // デバッグ出力ユーティリティ // 基本型(数値系) template>> void debug_print(const T& v) { cout << v; } // string inline void debug_print(const std::string& s) { cout << s; } inline void debug_print(const char* s) { cout << s; } // pair template void debug_print(const std::pair& p) { cout << "{"; debug_print(p.first); cout << ", "; debug_print(p.second); cout << "}"; } // queue template void debug_print(const std::queue& q) { auto q2 = q; cout << "queue["; while (!q2.empty()) { debug_print(q2.front()); q2.pop(); if (!q2.empty()) cout << ", "; } cout << "]"; } // stack template void debug_print(const std::stack& s) { auto s2 = s; cout << "stack["; std::vector tmp; while (!s2.empty()) { tmp.push_back(s2.top()); s2.pop(); } for (size_t i = 0; i < tmp.size(); ++i) { debug_print(tmp[i]); if (i + 1 != tmp.size()) cout << ", "; } cout << "]"; } // priority_queue template void debug_print(const std::priority_queue& pq) { auto q2 = pq; cout << "priority_queue["; std::vector tmp; while (!q2.empty()) { tmp.push_back(q2.top()); q2.pop(); } for (size_t i = 0; i < tmp.size(); ++i) { debug_print(tmp[i]); if (i + 1 != tmp.size()) cout << ", "; } cout << "]"; } // イテレータを持つコンテナ(string, queue, stack, priority_queue 以外) template auto debug_print(const T& c) -> decltype(std::begin(c), void()) { cout << "["; auto it = std::begin(c); while (it != std::end(c)) { debug_print(*it); if (++it != std::end(c)) cout << ", "; } cout << "]"; } // デバッグ用のマクロ(変数名と値を一緒に出力) #ifndef ONLINE_JUDGE #define DEBUG(...) cerr << #__VA_ARGS__ << " = "; debug_print(__VA_ARGS__); cerr << endl; #else #define DEBUG(...) #endif // 1次元vector出力関数 template void vc_cout(const vector& v) { for (size_t i = 0; i < v.size(); ++i) { cout << v[i]; if (i + 1 != v.size()) cout << " "; } cout << "\n"; } // 2次元vector出力関数 template void vv_cout(const vector>& v) { for (size_t i = 0; i < v.size(); ++i) { for (size_t j = 0; j < v[i].size(); ++j) { cout << v[i][j]; if (j + 1 != v[i].size()) cout << " "; } cout << "\n"; } } // `vector` 用のオーバーロード: 各文字列をそのまま1行で出力する void vv_cout(const vector& v) { for (const auto& s : v) cout << s << "\n"; } /* ********************************************************** ここまでテンプレ ********************************************************** */ ll T; int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cin >> T; while(T--){ ll N; cin >> N; vl a(N); nrep(i, N){ cin >> a[i]; } vvl dp(3, vl(2, -infl)); // dp[i][j]: i個目のブロックを見ているj0なら負1なら正 nrep(i, 2) { dp[0][i] = 0; } nrep(i, N) { vvl ndp = dp; nrep(j, 3) { nrep(k, 2) { ndp[j][k] += a[i] * (-1 + 2 * k); } } for(ll j = 1; j>=0; j--) { nrep(k, 2) { nrep(l, 2) { chmax(ndp[j + 1][l], ndp[j][k]); } } } dp = move(ndp); // DEBUG(i); // DEBUG(dp); } print(max(dp[2][0], dp[2][1])); } return 0; }