#include <bits/stdc++.h>
using namespace std;
long getMaximumGrossValue(vector<int> arr) {
if (arr.empty()) return 0;
// dp0, dp1, dp2, dp3 represent the maximum sum of the array processed so far,
// ending in Segment 0, 1, 2, and 3 respectively.
long long dp0 = 0, dp1 = 0, dp2 = 0, dp3 = 0;
for (size_t i = 0; i < arr.size(); i++) {
long long val = arr[i];
long long next_dp0, next_dp1, next_dp2, next_dp3;
if (i == 0) {
// For the very first element, it forms the start of whatever segment we choose.
next_dp0 = val;
next_dp1 = -val;
next_dp2 = val;
next_dp3 = -val;
} else {
// Segment 0 (+1): Must come from Segment 0
next_dp0 = dp0 + val;
// Segment 1 (-1): Can continue Segment 1, or transition from Segment 0
next_dp1 = max(dp0, dp1) - val;
// Segment 2 (+1): Can continue Segment 2, or transition from 0 or 1
next_dp2 = max({dp0, dp1, dp2}) + val;
// Segment 3 (-1): Can continue Segment 3, or transition from 0, 1, or 2
next_dp3 = max({dp0, dp1, dp2, dp3}) - val;
}
// Update states for the next element
dp0 = next_dp0;
dp1 = next_dp1;
dp2 = next_dp2;
dp3 = next_dp3;
}
// The maximum possible value is the best outcome across any of the valid ending states.
long long final_ans = max({dp0, dp1, dp2, dp3});
return (long)final_ans;
}
int main() {
// Example from the problem description
std::vector<int> arr = {-5, 3, 9, 4};
// vector<int> arr = {-1,1,-2,-2};
// vector<int> arr= {4,-8,2,-10,3,-20};
std::cout << "Max Gross Value: " << getMaximumGrossValue(arr) << std::endl; // Output: 21
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpsb25nIGdldE1heGltdW1Hcm9zc1ZhbHVlKHZlY3RvcjxpbnQ+IGFycikgewogICAgaWYgKGFyci5lbXB0eSgpKSByZXR1cm4gMDsKCiAgICAvLyBkcDAsIGRwMSwgZHAyLCBkcDMgcmVwcmVzZW50IHRoZSBtYXhpbXVtIHN1bSBvZiB0aGUgYXJyYXkgcHJvY2Vzc2VkIHNvIGZhciwgCiAgICAvLyBlbmRpbmcgaW4gU2VnbWVudCAwLCAxLCAyLCBhbmQgMyByZXNwZWN0aXZlbHkuCiAgICBsb25nIGxvbmcgZHAwID0gMCwgZHAxID0gMCwgZHAyID0gMCwgZHAzID0gMDsKCiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7IGkrKykgewogICAgICAgIGxvbmcgbG9uZyB2YWwgPSBhcnJbaV07CiAgICAgICAgCiAgICAgICAgbG9uZyBsb25nIG5leHRfZHAwLCBuZXh0X2RwMSwgbmV4dF9kcDIsIG5leHRfZHAzOwogICAgICAgIAogICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgLy8gRm9yIHRoZSB2ZXJ5IGZpcnN0IGVsZW1lbnQsIGl0IGZvcm1zIHRoZSBzdGFydCBvZiB3aGF0ZXZlciBzZWdtZW50IHdlIGNob29zZS4KICAgICAgICAgICAgbmV4dF9kcDAgPSB2YWw7CiAgICAgICAgICAgIG5leHRfZHAxID0gLXZhbDsKICAgICAgICAgICAgbmV4dF9kcDIgPSB2YWw7CiAgICAgICAgICAgIG5leHRfZHAzID0gLXZhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBTZWdtZW50IDAgKCsxKTogTXVzdCBjb21lIGZyb20gU2VnbWVudCAwCiAgICAgICAgICAgIG5leHRfZHAwID0gZHAwICsgdmFsOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gU2VnbWVudCAxICgtMSk6IENhbiBjb250aW51ZSBTZWdtZW50IDEsIG9yIHRyYW5zaXRpb24gZnJvbSBTZWdtZW50IDAKICAgICAgICAgICAgbmV4dF9kcDEgPSBtYXgoZHAwLCBkcDEpIC0gdmFsOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gU2VnbWVudCAyICgrMSk6IENhbiBjb250aW51ZSBTZWdtZW50IDIsIG9yIHRyYW5zaXRpb24gZnJvbSAwIG9yIDEKICAgICAgICAgICAgbmV4dF9kcDIgPSBtYXgoe2RwMCwgZHAxLCBkcDJ9KSArIHZhbDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFNlZ21lbnQgMyAoLTEpOiBDYW4gY29udGludWUgU2VnbWVudCAzLCBvciB0cmFuc2l0aW9uIGZyb20gMCwgMSwgb3IgMgogICAgICAgICAgICBuZXh0X2RwMyA9IG1heCh7ZHAwLCBkcDEsIGRwMiwgZHAzfSkgLSB2YWw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIFVwZGF0ZSBzdGF0ZXMgZm9yIHRoZSBuZXh0IGVsZW1lbnQKICAgICAgICBkcDAgPSBuZXh0X2RwMDsKICAgICAgICBkcDEgPSBuZXh0X2RwMTsKICAgICAgICBkcDIgPSBuZXh0X2RwMjsKICAgICAgICBkcDMgPSBuZXh0X2RwMzsKICAgIH0KCiAgICAvLyBUaGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBpcyB0aGUgYmVzdCBvdXRjb21lIGFjcm9zcyBhbnkgb2YgdGhlIHZhbGlkIGVuZGluZyBzdGF0ZXMuCiAgICBsb25nIGxvbmcgZmluYWxfYW5zID0gbWF4KHtkcDAsIGRwMSwgZHAyLCBkcDN9KTsKICAgIAogICAgcmV0dXJuIChsb25nKWZpbmFsX2FuczsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBFeGFtcGxlIGZyb20gdGhlIHByb2JsZW0gZGVzY3JpcHRpb24KICAgIHN0ZDo6dmVjdG9yPGludD4gYXJyID0gey01LCAzLCA5LCA0fTsKICAgIC8vIHZlY3RvcjxpbnQ+IGFyciA9IHstMSwxLC0yLC0yfTsKICAgIC8vIHZlY3RvcjxpbnQ+IGFycj0gezQsLTgsMiwtMTAsMywtMjB9OwogICAgc3RkOjpjb3V0IDw8ICJNYXggR3Jvc3MgVmFsdWU6ICIgPDwgZ2V0TWF4aW11bUdyb3NzVmFsdWUoYXJyKSA8PCBzdGQ6OmVuZGw7IC8vIE91dHB1dDogMjEKICAgIHJldHVybiAwOwp9