#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
ll maxTwoNonOverlappingSubarrays(const vector<ll>& arr) {
int n = arr.size();
if (n < 2) return 0;
vector<ll> leftMax(n);
vector<ll> rightMax(n);
// Forward pass: leftMax[i] = max subarray sum in arr[0...i]
ll currSum = 0;
ll maxSoFar = -1e18;
for (int i = 0; i < n; i++) {
currSum = max(arr[i], currSum + arr[i]);
maxSoFar = max(maxSoFar, currSum);
leftMax[i] = maxSoFar;
}
// Backward pass: rightMax[i] = max subarray sum in arr[i...n-1]
currSum = 0;
maxSoFar = -1e18;
for (int i = n - 1; i >= 0; i--) {
currSum = max(arr[i], currSum + arr[i]);
maxSoFar = max(maxSoFar, currSum);
rightMax[i] = maxSoFar;
}
// Combine maximum sums from left and right partitions
ll maxTotalSum = -1e18;
for (int i = 0; i < n - 1; i++) {
maxTotalSum = max(maxTotalSum, leftMax[i] + rightMax[i + 1]);
}
return maxTotalSum;
}
int main() {
vector<ll> arr = {-10, -5, 2, 4, -15, -20, 1, 2};
// Subarrays [2, 4] (sum 6) and [1, 2] (sum 3) give optimal result 9
cout << "Max Sum: " << maxTwoNonOverlappingSubarrays(arr) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbGwgPSBsb25nIGxvbmc7CgpsbCBtYXhUd29Ob25PdmVybGFwcGluZ1N1YmFycmF5cyhjb25zdCB2ZWN0b3I8bGw+JiBhcnIpIHsKICAgIGludCBuID0gYXJyLnNpemUoKTsKICAgIGlmIChuIDwgMikgcmV0dXJuIDA7CgogICAgdmVjdG9yPGxsPiBsZWZ0TWF4KG4pOwogICAgdmVjdG9yPGxsPiByaWdodE1heChuKTsKCiAgICAvLyBGb3J3YXJkIHBhc3M6IGxlZnRNYXhbaV0gPSBtYXggc3ViYXJyYXkgc3VtIGluIGFyclswLi4uaV0KICAgIGxsIGN1cnJTdW0gPSAwOwogICAgbGwgbWF4U29GYXIgPSAtMWUxODsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY3VyclN1bSA9IG1heChhcnJbaV0sIGN1cnJTdW0gKyBhcnJbaV0pOwogICAgICAgIG1heFNvRmFyID0gbWF4KG1heFNvRmFyLCBjdXJyU3VtKTsKICAgICAgICBsZWZ0TWF4W2ldID0gbWF4U29GYXI7CiAgICB9CgogICAgLy8gQmFja3dhcmQgcGFzczogcmlnaHRNYXhbaV0gPSBtYXggc3ViYXJyYXkgc3VtIGluIGFycltpLi4ubi0xXQogICAgY3VyclN1bSA9IDA7CiAgICBtYXhTb0ZhciA9IC0xZTE4OwogICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGN1cnJTdW0gPSBtYXgoYXJyW2ldLCBjdXJyU3VtICsgYXJyW2ldKTsKICAgICAgICBtYXhTb0ZhciA9IG1heChtYXhTb0ZhciwgY3VyclN1bSk7CiAgICAgICAgcmlnaHRNYXhbaV0gPSBtYXhTb0ZhcjsKICAgIH0KCiAgICAvLyBDb21iaW5lIG1heGltdW0gc3VtcyBmcm9tIGxlZnQgYW5kIHJpZ2h0IHBhcnRpdGlvbnMKICAgIGxsIG1heFRvdGFsU3VtID0gLTFlMTg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKICAgICAgICBtYXhUb3RhbFN1bSA9IG1heChtYXhUb3RhbFN1bSwgbGVmdE1heFtpXSArIHJpZ2h0TWF4W2kgKyAxXSk7CiAgICB9CgogICAgcmV0dXJuIG1heFRvdGFsU3VtOwp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxsbD4gYXJyID0gey0xMCwgLTUsIDIsIDQsIC0xNSwgLTIwLCAxLCAyfTsKICAgIAogICAgLy8gU3ViYXJyYXlzIFsyLCA0XSAoc3VtIDYpIGFuZCBbMSwgMl0gKHN1bSAzKSBnaXZlIG9wdGltYWwgcmVzdWx0IDkKICAgIGNvdXQgPDwgIk1heCBTdW06ICIgPDwgbWF4VHdvTm9uT3ZlcmxhcHBpbmdTdWJhcnJheXMoYXJyKSA8PCBlbmRsOyAKICAgIAogICAgcmV0dXJuIDA7Cn0=