import
java.util.*;
class
Node {
int
maxVal, greatestPSum;
Node(
int
maxVal,
int
greatestPSum) {
this
.maxVal = maxVal;
this
.greatestPSum = greatestPSum;
}
}
public
class
Main {
static
Node[] st =
new
Node[
100009
];
static
Node util(Node x, Node y) {
Node ans =
new
Node(
0
,
0
);
ans.greatestPSum = Math.max(x.maxVal + y.maxVal,
Math.max(x.greatestPSum, y.greatestPSum));
ans.maxVal = Math.max(x.maxVal, y.maxVal);
return
ans;
}
static
int
getMid(
int
s,
int
e) {
return
s + (e - s) /
2
;
}
static
Node query(
int
ss,
int
se,
int
qs,
int
qe,
int
index) {
if
(qs <= ss && qe >= se)
return
st[index];
Node temp =
new
Node(-
1
, -
1
);
if
(se < qs || ss > qe)
return
temp;
int
mid = getMid(ss, se);
return
util(query(ss, mid, qs, qe,
2
* index +
1
),
query(mid +
1
, se, qs, qe,
2
* index +
2
));
}
static
Node checkQuery(
int
n,
int
qs,
int
qe) {
Node temp =
new
Node(-
1
, -
1
);
if
(qs <
0
|| qe > n -
1
|| qs > qe) {
System.out.println(
"Invalid Input"
);
return
temp;
}
return
query(
0
, n -
1
, qs, qe,
0
);
}
static
Node constructST(
int
arr[],
int
ss,
int
se,
int
si) {
if
(ss == se) {
st[si] =
new
Node(arr[ss],
0
);
return
st[si];
}
int
mid = getMid(ss, se);
st[si] = util(constructST(arr, ss, mid, si *
2
+
1
),
constructST(arr, mid +
1
, se, si *
2
+
2
));
return
st[si];
}
static
void
operation(
int
arr[],
int
n,
int
qs,
int
qe) {
constructST(arr,
0
, n -
1
,
0
);
Node ans = checkQuery(n, qs, qe);
System.out.println(ans.greatestPSum);
}
public
static
void
main(String args[]) {
int
arr[] = {
1
,
3
,
2
,
7
,
9
,
11
};
int
n = arr.length;
int
L =
1
;
int
R =
4
;
operation(arr, n, L, R);
}
}