Problem:
Score : 700 points

Problem Statement

We will define the median of a sequence b of length M, as follows:

Let b' be the sequence obtained by sorting b in non-decreasing order. Then, the value of the (M / 2 + 1)-th element of b' is the median of b. Here, / is integer division, rounding down.

For example, the median of (10, 30, 20) is 20; the median of (10, 30, 20, 40) is 30; the median of (10, 10, 10, 20, 30) is 10.

Snuke comes up with the following problem.

You are given a sequence a of length N.
For each pair (l, r) (1 \leq l \leq r \leq N), let m_{l, r} be the median of the contiguous subsequence (a_l, a_{l + 1}, ..., a_r) of a.
We will list m_{l, r} for all pairs (l, r) to create a new sequence m.
Find the median of m.

Constraints

1 \leq N \leq 10^5

a_i is an integer.

1 \leq a_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N

Output

Print the median of m.

Sample Input 1

3
10 30 20

Sample Output 1

30

The median of each contiguous subsequence of a is as follows:

The median of (10) is 10.

The median of (30) is 30.

The median of (20) is 20.

The median of (10, 30) is 30.

The median of (30, 20) is 30.

The median of (10, 30, 20) is 20.

Thus, m = (10, 30, 20, 30, 30, 20) and the median of m is 30.

Sample Input 2

1
10

Sample Output 2

10

Sample Input 3

10
5 9 5 9 8 9 3 5 4 3

Sample Output 3

8

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
#define ll long long
#define ld long double
#define rep(i,n) for(int i = 0; i < (int)(n); i++)
#define repo(i,n) for(int i = 1; i < (int)(n); i++)
#define pb push_back
#define mp make_pair
#define np next_permutation
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define uniq(v) v.erase(unique(v.begin(),v.end()),v.end())
#define lb(v,x) (lower_bound(v.begin(),v.end(),x)-v.begin())
#define ub(v,x) (upper_bound(v.begin(),v.end(),x)-v.begin())
const ll mod=1000000007;
//const ll mod=998244353;
const ld pi=acos(-1.0);
const ll INF = 1LL<<61;
template<class T>bool chmax(T &a, const T &b) { 
  if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) {
  if (b<a) { a=b; return 1; } return 0; }
ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }
ll jou(ll N, ll P){if(P==0) return 1;
  if(P%2==0){ll t = jou(N, P/2);return t*t % mod;
  }return (N * jou(N, P-1)) % mod;}  //jou(n,mod-2)で逆元
//intの最大値2147483647 ≒ 2×10^9
//long longの最大値9223372036854775807 ≒ 9×10^18
//'大文字'+=32;    で小文字に
//  cout << fixed << setprecision (20);   小数点以下2０桁まで
//実行時間制約2秒では２×10^8回くらいまで計算できる



//————————Fenwick  BIT  転倒数———————————————————————

template<typename T>
class BIT{
  public:
    int N;
    vector<T> data;
    BIT(T _N):N(_N){
        data.assign(N+1, 0);
    };
    
    // a is 1-indexed
    void add(int a, T w){
        for(int x = a; x <= N; x += x & -x) data[x] += w;
    }
    // 1-indexed sum of prefix [0, a]
    T sum(int a){
        T res = 0;
        for(int x = a; x > 0; x -= x & -x) res += data[x];
        return res;
    }
    // 1-indexed sum of range [l, r]
    T sum(int l, int r){return sum(r) - sum(l-1);}

    // 0-indexed add
    void add0(int a, T w){add(a + 1, w);}
    // 0-indexed sum
    T sum0(int a){return sum(a + 1);}
    // 0-indexed sum of range
    T sum0(int l, int r){return sum0(r) - sum0(l-1);}

    //1-indexed でv1+v2+...+vx >= w となる最小のx
    T blb(T w) {
      if(w <= 0) return 0;
      int res = 0;
      int i=1;
      while(i*2 <= N) {i *= 2;}
      //i は N以下の最大の２べき
      for(int k = i; k > 0; k /= 2) {
        if(res + k <= N && data[res + k] < w) {
          w -= data[res + k];
          res += k;
        }
      }
      return res+1;
    }

    /* debug */
    void print() {
        rep(i,data.size()) cout << sum0(i,i) << ",";
        cout << endl;
    }

};


  int tento(vector<ll>v){
    int n=v.size();

    //v2に座標圧縮
    vector<ll> v2(n);
    vector<pair<ll, int>> vp;    
    rep(i,n){
      vp.pb(mp(v[i], i));
    }
    sort(all(vp));
    rep(i,n) v2[vp[i].se]=i;

    BIT<ll> bit(n);
    int rtn = 0;
    rep(i,n){
      //rtn += bit.sum0(v2[i]) でi<jかつVi<Vjの組みの数が出せる
      rtn +=  i - bit.sum0(v2[i]);
      bit.add0(v2[i], 1);      
    }
    return rtn;
  } 


//——————————————————————————————————————————


int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);

  int n;
  cin>>n;

  vector<ll> p(n);
  rep(i,n){
    cin>>p[i];
  }

//————————————————二分探索——————————————————————————
//部分列の組み合わせはn*(n+1)/2個
//mid以上の数が(n*(n+1)+3)/4個

ll ok = 0;
ll ng = 1000000001;
while (abs(ok - ng) > 1) {
  ll mid = (ng + ok) / 2;

  vector<ll> r=p;
  rep(i,n){
    if(r[i]>=mid) r[i]=1;
    else r[i]=-1;
  }
  vector<ll> s(n+1);
  s[0]=0;
  rep(i,n){
    s[i+1]=s[i]+r[i];
  }

  ll cnt=0;
  vector<ll> q=s;
  sort(all(q));
  uniq(q);

  BIT<ll> bit(n+10);
  rep(i,n+1){
    int id=lb(q,s[i]);
    cnt += bit.sum0(id);
    bit.add0(id,1);
  }

  (cnt>=(n*(n+1)+3)/4? ok : ng) = mid;
}

  cout << ok << endl;

}