import
java.util.*;
class
GFG
{
static
class
Node
{
int
_max;
int
_pre;
int
_suf;
int
_sum;
};
static
Node getNode(
int
x)
{
Node a =
new
Node();
a._max = x;
a._pre = x;
a._suf = x;
a._sum = x;
return
a;
}
static
Node merg(Node l, Node r)
{
Node ans =
new
Node();
ans._max = ans._pre = ans._suf = ans._sum =
0
;
ans._pre = Arrays.stream(
new
int
[]{l._pre, l._sum+r._pre,
l._sum+r._sum}).max().getAsInt();
ans._suf = Arrays.stream(
new
int
[]{r._suf, r._sum+l._suf,
l._sum+r._sum}).max().getAsInt();
ans._sum = l._sum + r._sum;
ans._max = Arrays.stream(
new
int
[]{ans._pre,
ans._suf,
ans._sum,
l._max, r._max,
l._suf+r._pre}).max().getAsInt();
return
ans;
}
static
Node getMaxSumSubArray(
int
l,
int
r,
int
[]ar)
{
if
(l == r)
return
getNode(ar[l]);
int
mid = (l + r) >>
1
;
Node left = getMaxSumSubArray(l, mid, ar);
Node right = getMaxSumSubArray(mid +
1
, r, ar);
return
merg(left, right);
}
public
static
void
main(String[] args)
{
int
[]ar = {-
2
, -
5
,
6
, -
2
, -
3
,
1
,
5
, -
6
};
int
n = ar.length;
Node ans = getMaxSumSubArray(
0
, n -
1
, ar);
System.out.print(
"Answer is "
+ ans._max +
"\n"
);
}
}