#include<iostream>
using namespace std;
// Function to print contiguous subarray with the largest sum
// in given set of integers
void kadane(int arr[], int n)
{
// stores maximum sum subarray found so far
int max_so_far = arr[0];
// stores maximum sum of subarray ending at current position
int max_ending_here = arr[0];
// stores end-points of maximum sum subarray found so far
int start = 0, end = 0;
// stores starting index of a positive sum sequence
int beg = 0;
// traverse the given array
for (int i = 1; i < n; i++)
{
// update maximum sum of subarray "ending" at index i
max_ending_here = max_ending_here + arr[i];
// if maximum sum is negative, set it to 0
if (max_ending_here < arr[i])
{
max_ending_here = arr[i]; // empty subarray
beg = i ;
}
// update result if current subarray sum is found to be greater
if (max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
start = beg;
end = i;
}
}
cout << "The sum of contiguous subarray with the largest sum is " <<
max_so_far << endl;
cout << "The contiguous subarray with the largest sum is ";
for (int i = start; i <= end; i++)
cout << arr[i] << " ";
}
// main function
int main()
{
int arr[] = { -2, -1, -3, -4, -1, -2, -1, -5, -4 };
int n = sizeof(arr)/sizeof(arr[0]);
kadane(arr, n);
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBGdW5jdGlvbiB0byBwcmludCBjb250aWd1b3VzIHN1YmFycmF5IHdpdGggdGhlIGxhcmdlc3Qgc3VtCi8vIGluIGdpdmVuIHNldCBvZiBpbnRlZ2Vycwp2b2lkIGthZGFuZShpbnQgYXJyW10sIGludCBuKQp7CiAgICAvLyBzdG9yZXMgbWF4aW11bSBzdW0gc3ViYXJyYXkgZm91bmQgc28gZmFyCiAgICBpbnQgbWF4X3NvX2ZhciA9IGFyclswXTsKCiAgICAvLyBzdG9yZXMgbWF4aW11bSBzdW0gb2Ygc3ViYXJyYXkgZW5kaW5nIGF0IGN1cnJlbnQgcG9zaXRpb24KICAgIGludCBtYXhfZW5kaW5nX2hlcmUgPSBhcnJbMF07CgogICAgLy8gc3RvcmVzIGVuZC1wb2ludHMgb2YgbWF4aW11bSBzdW0gc3ViYXJyYXkgZm91bmQgc28gZmFyCiAgICBpbnQgc3RhcnQgPSAwLCBlbmQgPSAwOwoKICAgIC8vIHN0b3JlcyBzdGFydGluZyBpbmRleCBvZiBhIHBvc2l0aXZlIHN1bSBzZXF1ZW5jZQogICAgaW50IGJlZyA9IDA7CgogICAgLy8gdHJhdmVyc2UgdGhlIGdpdmVuIGFycmF5CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICAvLyB1cGRhdGUgbWF4aW11bSBzdW0gb2Ygc3ViYXJyYXkgImVuZGluZyIgYXQgaW5kZXggaQogICAgICAgIG1heF9lbmRpbmdfaGVyZSA9IG1heF9lbmRpbmdfaGVyZSArIGFycltpXTsKCiAgICAgICAgLy8gaWYgbWF4aW11bSBzdW0gaXMgbmVnYXRpdmUsIHNldCBpdCB0byAwCiAgICAgICAgaWYgKG1heF9lbmRpbmdfaGVyZSA8IGFycltpXSkKICAgICAgICB7CiAgICAgICAgICAgIG1heF9lbmRpbmdfaGVyZSA9IGFycltpXTsgICAgLy8gZW1wdHkgc3ViYXJyYXkKICAgICAgICAgICAgYmVnID0gaSA7CiAgICAgICAgfQoKICAgICAgICAvLyB1cGRhdGUgcmVzdWx0IGlmIGN1cnJlbnQgc3ViYXJyYXkgc3VtIGlzIGZvdW5kIHRvIGJlIGdyZWF0ZXIKICAgICAgICBpZiAobWF4X3NvX2ZhciA8IG1heF9lbmRpbmdfaGVyZSkKICAgICAgICB7CiAgICAgICAgICAgIG1heF9zb19mYXIgPSBtYXhfZW5kaW5nX2hlcmU7CiAgICAgICAgICAgIHN0YXJ0ID0gYmVnOwogICAgICAgICAgICBlbmQgPSBpOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8ICJUaGUgc3VtIG9mIGNvbnRpZ3VvdXMgc3ViYXJyYXkgd2l0aCB0aGUgbGFyZ2VzdCBzdW0gaXMgIiA8PAogICAgICAgICAgICBtYXhfc29fZmFyIDw8IGVuZGw7CgogICAgY291dCA8PCAiVGhlIGNvbnRpZ3VvdXMgc3ViYXJyYXkgd2l0aCB0aGUgbGFyZ2VzdCBzdW0gaXMgIjsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykKICAgICAgICBjb3V0IDw8IGFycltpXSA8PCAiICI7Cn0KCi8vIG1haW4gZnVuY3Rpb24KaW50IG1haW4oKQp7CiAgICBpbnQgYXJyW10gPSB7IC0yLCAtMSwgLTMsIC00LCAtMSwgLTIsIC0xLCAtNSwgLTQgfTsKICAgIGludCBuID0gc2l6ZW9mKGFycikvc2l6ZW9mKGFyclswXSk7CgogICAga2FkYW5lKGFyciwgbik7CgogICAgcmV0dXJuIDA7Cn0=