#include <bits/stdc++.h>
using namespace std;
int main()
{
// index 1 2 3 4 5
int b[5] = {5,-3,-5,15,5};
int n=5;
int maxPrefixSum[5];
int maxSuffixSum[5];
// current = 0
// maxPrefixSum = 0
//Initially both the current and maxPrefixSum will be zero
// 5 = max( 5 , 0 + 5)
// current = max(b[i] , current + b[i])
// 5 = max( 5 , 5 )
//maxPrefixSum[i] = max(maxPrefixSum[i-1] , current)
int current = b[0];
maxPrefixSum[0] = b[0];
for(int i=1; i<n; i++)
{
current = max(b[i] , current + b[i]);
maxPrefixSum[i] = max(maxPrefixSum[i-1] , current);
}
// current = 0
//maxSuffixSum = 0
// 15 = max( 15, 0 + 15)
//current = max(b[i] , current + b[i]);
// 20 = max( 15+5 , 15)
//maxSuffixSum[i] = max(maxSuffixSum[i+1] , current);
current = b[n-1];
maxSuffixSum[n-1] = b[n-1];
for(int i=n-2; i>=0; i--)
{
current = max(b[i] , current + b[i]);
maxSuffixSum[i] = max(maxSuffixSum[i+1] , current);
}
int maxSum = INT_MIN;
for(int i=1; i<n-1; i++)
{
// 25 = max( 0 , 5 + 20)
maxSum = max(maxSum , maxPrefixSum[i] + maxSuffixSum[i+1]);
}
cout<<"Max sum of two nonoverlapping subarrays: "<<maxSum; // o/p -> 25
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIAp7CiAgICAvLyBpbmRleCAgICAgMSAgIDIgIDMgICA0ICA1CiAgICAgaW50IGJbNV0gPSB7NSwtMywtNSwxNSw1fTsKICAgICBpbnQgbj01OwoKICAgIGludCBtYXhQcmVmaXhTdW1bNV07CiAgICBpbnQgbWF4U3VmZml4U3VtWzVdOwoKICAgIC8vIGN1cnJlbnQgPSAwCiAgICAvLyBtYXhQcmVmaXhTdW0gPSAwCiAgICAvL0luaXRpYWxseSBib3RoIHRoZSBjdXJyZW50IGFuZCBtYXhQcmVmaXhTdW0gd2lsbCBiZSB6ZXJvIAogICAgLy8gICAgIDUgICAgID0gIG1heCggNSAsICAwICAgKyAgIDUpCiAgICAvLyAgY3VycmVudCA9IG1heChiW2ldICwgY3VycmVudCArIGJbaV0pCiAgICAvLyAgICAgICAgICAgICAgIDUgICAgICAgICA9IG1heCggIDUgICAgLCAgICAgNSApCiAgICAvL21heFByZWZpeFN1bVtpXSA9IG1heChtYXhQcmVmaXhTdW1baS0xXSAsIGN1cnJlbnQpCiAgICAKICAgIGludCBjdXJyZW50ID0gYlswXTsKICAgIG1heFByZWZpeFN1bVswXSA9IGJbMF07CiAgICBmb3IoaW50IGk9MTsgaTxuOyBpKyspCiAgICB7CiAgICAgICAgY3VycmVudCA9IG1heChiW2ldICwgY3VycmVudCArIGJbaV0pOwogICAgICAgIG1heFByZWZpeFN1bVtpXSA9IG1heChtYXhQcmVmaXhTdW1baS0xXSAsIGN1cnJlbnQpOwogICAgfQoKICAgIC8vIGN1cnJlbnQgPSAwCiAgICAvL21heFN1ZmZpeFN1bSA9IDAKICAgIC8vICAgICAxNSAgPSAgICBtYXgoIDE1LCAgICAgICAwICArICAxNSkKICAgIC8vY3VycmVudCA9IG1heChiW2ldICwgY3VycmVudCArIGJbaV0pOwogICAgLy8gICAgICAgICAgIDIwICAgICAgICAgICAgICAgID0gbWF4KCAgIDE1KzUgICwgIDE1KQogICAgLy9tYXhTdWZmaXhTdW1baV0gPSBtYXgobWF4U3VmZml4U3VtW2krMV0gLCBjdXJyZW50KTsKICAgIGN1cnJlbnQgPSBiW24tMV07CiAgICBtYXhTdWZmaXhTdW1bbi0xXSA9IGJbbi0xXTsKICAgIGZvcihpbnQgaT1uLTI7IGk+PTA7IGktLSkKICAgIHsKICAgICAgICBjdXJyZW50ID0gbWF4KGJbaV0gLCBjdXJyZW50ICsgYltpXSk7CiAgICAgICAgbWF4U3VmZml4U3VtW2ldID0gbWF4KG1heFN1ZmZpeFN1bVtpKzFdICwgY3VycmVudCk7CiAgICB9CgogICAgCiAgICBpbnQgbWF4U3VtID0gSU5UX01JTjsKICAgIGZvcihpbnQgaT0xOyBpPG4tMTsgaSsrKQogICAgewogICAgICAgIC8vICAgICAyNSAgICAgICAgPSBtYXgoICAgICAwICAgICAgICAgICwgICAgICAgIDUgICAgICAgICAgICAgICAgICAgICArICAgICAgICAgICAyMCkKICAgICAgICBtYXhTdW0gPSBtYXgobWF4U3VtICwgbWF4UHJlZml4U3VtW2ldICsgbWF4U3VmZml4U3VtW2krMV0pOwogICAgfQoKICAgIGNvdXQ8PCJNYXggc3VtIG9mIHR3byBub25vdmVybGFwcGluZyBzdWJhcnJheXM6ICI8PG1heFN1bTsgLy8gby9wIC0+IDI1Cn0g