//Maximum Sub-array Problem using Divide and Conquer approach
#include<iostream>
#include<tuple>
#include<vector>
#define INF -10000000
using namespace std;
int MaxCrossSum(vector<int>& A,int low,int mid,int high)
{
int left_sum=INF;
int sum=0,max_left,max_right;
for(int i=low;i<=mid;i++)
{
sum=sum+A[i];
if(sum>left_sum)
{
left_sum=sum;
max_left=i;
}
}
int right_sum=INF;
sum=0;
for(int i=mid+1;i<=high;++i)
{
sum=sum+A[i];
if(sum>right_sum)
{
right_sum=sum;
max_right=i;
}
}
return left_sum+right_sum;
}
int MaxSubarraySum(vector<int>& A,int low,int high)
{
if(low==high)
{
return A[low];
}
else
{
int left_low,left_high,right_low,right_high,right_sum,left_sum,cross_low,cross_high,cross_sum;
int mid=(low+high)/2;
left_sum=MaxSubarraySum(A,low,mid);
right_sum=MaxSubarraySum(A,mid+1,high);
cross_sum=MaxCrossSum(A,low,mid,high);
if(left_sum>=right_sum && left_sum>=cross_sum)
{
return left_sum;
}
if(right_sum>=left_sum && right_sum>=cross_sum)
{
return right_sum;
}
else
return cross_sum;
}
}
int main()
{
vector<int> A={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22};
int tup=MaxSubarraySum(A,0,12);
cout<<tup;
}
Ly9NYXhpbXVtIFN1Yi1hcnJheSBQcm9ibGVtIHVzaW5nIERpdmlkZSBhbmQgQ29ucXVlciBhcHByb2FjaAoKI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHR1cGxlPgojaW5jbHVkZTx2ZWN0b3I+CiNkZWZpbmUgSU5GIC0xMDAwMDAwMAp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IE1heENyb3NzU3VtKHZlY3RvcjxpbnQ+JiBBLGludCBsb3csaW50IG1pZCxpbnQgaGlnaCkKewogICAgaW50IGxlZnRfc3VtPUlORjsKICAgIGludCBzdW09MCxtYXhfbGVmdCxtYXhfcmlnaHQ7CiAgICBmb3IoaW50IGk9bG93O2k8PW1pZDtpKyspCiAgICB7CiAgICAgICAgc3VtPXN1bStBW2ldOwogICAgICAgIGlmKHN1bT5sZWZ0X3N1bSkKICAgICAgICB7CiAgICAgICAgICAgIGxlZnRfc3VtPXN1bTsKICAgICAgICAgICAgbWF4X2xlZnQ9aTsKICAgICAgICB9CiAgICB9CiAgICBpbnQgcmlnaHRfc3VtPUlORjsKICAgIHN1bT0wOwogICAgZm9yKGludCBpPW1pZCsxO2k8PWhpZ2g7KytpKQogICAgewogICAgICAgIHN1bT1zdW0rQVtpXTsKICAgICAgICBpZihzdW0+cmlnaHRfc3VtKQogICAgICAgIHsKICAgICAgICAgICAgcmlnaHRfc3VtPXN1bTsKICAgICAgICAgICAgbWF4X3JpZ2h0PWk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGxlZnRfc3VtK3JpZ2h0X3N1bTsKfQoKCmludCBNYXhTdWJhcnJheVN1bSh2ZWN0b3I8aW50PiYgQSxpbnQgbG93LGludCBoaWdoKQp7CgogICAgaWYobG93PT1oaWdoKQogICAgewogICAgICAgIHJldHVybiBBW2xvd107CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaW50IGxlZnRfbG93LGxlZnRfaGlnaCxyaWdodF9sb3cscmlnaHRfaGlnaCxyaWdodF9zdW0sbGVmdF9zdW0sY3Jvc3NfbG93LGNyb3NzX2hpZ2gsY3Jvc3Nfc3VtOwogICAgICAgIGludCBtaWQ9KGxvdytoaWdoKS8yOwogICAgICAgIGxlZnRfc3VtPU1heFN1YmFycmF5U3VtKEEsbG93LG1pZCk7CiAgICAgICAgcmlnaHRfc3VtPU1heFN1YmFycmF5U3VtKEEsbWlkKzEsaGlnaCk7CiAgICAgICAgY3Jvc3Nfc3VtPU1heENyb3NzU3VtKEEsbG93LG1pZCxoaWdoKTsKCiAgICAgICAgaWYobGVmdF9zdW0+PXJpZ2h0X3N1bSAmJiBsZWZ0X3N1bT49Y3Jvc3Nfc3VtKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGxlZnRfc3VtOwogICAgICAgIH0KCiAgICAgICAgaWYocmlnaHRfc3VtPj1sZWZ0X3N1bSAmJiByaWdodF9zdW0+PWNyb3NzX3N1bSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiByaWdodF9zdW07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIGNyb3NzX3N1bTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8aW50PiBBPXsxMywtMywtMjUsMjAsLTMsLTE2LC0yMywxOCwyMCwtNywxMiwtNSwtMjJ9OwogICAgaW50IHR1cD1NYXhTdWJhcnJheVN1bShBLDAsMTIpOwogICAgY291dDw8dHVwOwp9