using
System.Collections.Generic;
using
System;
class
GFG{
static
bool
areAllNegative(
int
[]arr)
{
int
n = arr.Length;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] > 0)
return
false
;
}
return
true
;
}
static
int
[] getRightToLeftKadane(
int
[]arr)
{
int
max_so_far = 0, max_ending_here = 0;
int
size = arr.Length;
int
[]new_arr =
new
int
[size];
for
(
int
i = 0; i < size; i++)
new_arr[i] = arr[i];
for
(
int
i = size - 1; i >= 0; i--)
{
max_ending_here = max_ending_here +
new_arr[i];
if
(max_ending_here < 0)
max_ending_here = 0;
else
if
(max_so_far < max_ending_here)
max_so_far = max_ending_here;
new_arr[i] = max_so_far;
}
return
new_arr;
}
static
int
[] getPrefixSum(
int
[]arr)
{
int
n = arr.Length;
int
[]new_arr =
new
int
[n];
for
(
int
i = 0; i < n; i++)
new_arr[i] = arr[i];
for
(
int
i = 1; i < n; i++)
new_arr[i] = new_arr[i - 1] +
new_arr[i];
return
new_arr;
}
static
int
maxSumSubArr(
int
[]a)
{
int
max_so_far = 0, max_ending_here = 0;
int
n = a.Length;
for
(
int
i = 0; i < n; i++)
{
max_ending_here = max_ending_here + a[i];
if
(max_ending_here < 0)
max_ending_here = 0;
else
if
(max_so_far < max_ending_here)
max_so_far = max_ending_here;
}
return
max_so_far;
}
static
int
maxSumSubWithOp(
int
[]arr)
{
int
[]kadane_r_to_l= getRightToLeftKadane(arr);
int
size = arr.Length;
int
[] prefixSum = getPrefixSum(arr);
for
(
int
i = 1; i < size; i++)
{
prefixSum[i] = Math.Max(prefixSum[i - 1],
prefixSum[i]);
}
int
max_subarray_sum = 0;
for
(
int
i = 0; i < size - 1; i++)
{
max_subarray_sum = Math.Max(max_subarray_sum,
prefixSum[i] +
kadane_r_to_l[i + 1]);
}
return
max_subarray_sum;
}
static
int
maxSum(
int
[] arr,
int
size)
{
if
(areAllNegative(arr))
{
int
mx = -1000000000;
for
(
int
i = 0; i < size; i++)
{
if
(arr[i] > mx)
mx = arr[i];
}
return
mx;
}
int
resSum = maxSumSubArr(arr);
resSum = Math.Max(resSum, maxSumSubWithOp(arr));
int
[] reverse_arr =
new
int
[size];
for
(
int
i = 0; i < size; i++)
reverse_arr[size - 1 - i] = arr[i];
resSum = Math.Max(resSum,
maxSumSubWithOp(reverse_arr));
return
resSum;
}
public
static
void
Main()
{
int
[]arr = { -9, 21, 24, 24, -51,
-6, 17, -42, -39, 33 };
int
size = arr.Length;
Console.Write(maxSum(arr, size));
}
}