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 Kotlin (1.0.0) (judge verdict: Accepted)

fun main(args: Array<String>) {
    Program().solve()
}

class Program {
    fun solve() {
        val sc = MyScanner()
        val n = sc.nextInt()
        val a = sc.intList()
        val all = n.toLong() * (n + 1) / 2
        // 中央値 m以下の値 M/2強 最小

        fun check(l: Long): Boolean {
            var res = 0L
            // l以下の値を1 以外 -1
            // いままでの累積和見る
            // 現在の累積和 - 累積和 > 0の数
            val bit = FenwickTree(2 * n + 1)
            bit.add(n, 1)
            var sum = 0
            for (i in 0 until n) {
                sum += if (a[i] <= l) 1 else -1
                res += bit.sum(sum + n)
                bit.add(sum + n, 1)
            }
            // println("$all $res $l")
            return res * 2 > all
        }

        var ok = 10000000000L
        var ng = 0L
        while (ok - ng > 1) {
            val mid = (ok + ng) / 2
            if (check(mid)) {
                ok = mid
            } else {
                ng = mid
            }
        }
        println(ok)
    }
}

class FenwickTree(private val size: Int) {
    private val tree = Array(size + 1) { 0 }

    // a[i]にnを加算
    fun add(i: Int, n: Int) {
        var t = i + 1
        while (t <= size) {
            tree[t] += n
            t += (t and (-t))
        }
    }

    // [0,i)の合計を求める
    fun sum(i: Int): Int {
        var result = 0
        var t = i
        while (t > 0) {
            result += tree[t]
            t -= (t and (-t))
        }
        return result
    }
}

class MyScanner() {
    private var index = 0
    private var line = listOf<String>()

    fun next(): String {
        while (line.size <= index) {
            line = readLine()!!.split(' ')
            index = 0
        }
        return line[index++]
    }

    fun nextInt() = next().toInt()
    fun nextLong() = next().toLong()
    fun nextDouble() = next().toDouble()
    fun nextCharArray() = next().toCharArray()
    fun nextChar() = next()[0]

    fun strList(): List<String> {
        index = line.size
        return readLine()!!.split(' ')
    }

    fun intList() = strList().map { it.toInt() }
    fun longList() = strList().map { it.toLong() }
    fun doubleList() = strList().map { it.toDouble() }
}