using
System;
public
class
GFG{
static
int
[,] dp =
new
int
[100000 + 5, 2];
static
int
max_subsequence_sum(
int
[] arr,
int
n,
int
i,
int
last)
{
if
(i >= n) {
return
0;
}
if
(dp[i, last] != -1) {
return
dp[i, last];
}
if
(last == 1) {
int
t1 = arr[i]
+ max_subsequence_sum(arr, n,
i + 1, 1);
int
t2 = max_subsequence_sum(arr, n,
i + 1, 0);
return
dp[i, last] = Math.Max(t1, t2);
}
else
{
int
t = arr[i]
+ max_subsequence_sum(arr, n,
i + 1, 1);
return
dp[i, last] = t;
}
}
static
int
helper_max_sub_sum(
int
[] arr,
int
n)
{
for
(
int
i=0;i<dp.GetLength(0);i++){
for
(
int
j=0;j < dp.GetLength(1);j++){
dp[i, j]= -1;
}
}
int
max_sub_sum
= max_subsequence_sum(arr, n, 0, 1);
return
max_sub_sum;
}
static
bool
is_given_median_possible(
int
[] arr,
int
n,
int
median)
{
int
[] modified =
new
int
[n];
for
(
int
i =0; i < n; i++) {
if
(arr[i] >= median) {
modified[i] = 1;
}
else
{
modified[i] = -1;
}
}
int
max_sub_sum
= helper_max_sub_sum(modified, n);
if
(max_sub_sum > 0) {
return
true
;
}
return
false
;
}
static
int
binary_search_for_median(
int
[] arr,
int
n)
{
int
ans = 1;
int
low = 99999999;
int
high = -9999999;
for
(
int
i=0;i<arr.Length;i++)
{
low = Math.Min(low, arr[i]);
high = Math.Max(high, arr[i]);
}
while
(low <= high) {
int
mid = low + (high - low) / 2;
if
(is_given_median_possible(arr,
n, mid)==
true
) {
ans = mid;
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return
ans;
}
static
public
void
Main (){
int
N = 7;
int
[] Arr = { 3, 1, 4, 1, 5, 9, 2 };
int
ans = binary_search_for_median(Arr, N);
Console.Write( ans);
}
}