Problem:
Score : 300 points

Problem Statement

Takahashi made N problems for competitive programming.
The problems are numbered 1 to N, and the difficulty of Problem i is represented as an integer d_i (the higher, the harder).

He is dividing the problems into two categories by choosing an integer K, as follows:

A problem with difficulty K or higher will be for ARCs.

A problem with difficulty lower than K will be for ABCs.

How many choices of the integer K make the number of problems for ARCs and the number of problems for ABCs the same?

Problem Statement

2 \leq N \leq 10^5

N is an even number.

1 \leq d_i \leq 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
d_1 d_2 ... d_N

Output

Print the number of choices of the integer K that make the number of problems for ARCs and the number of problems for ABCs the same.

Sample Input 1

6
9 1 4 4 6 7

Sample Output 1

2

If we choose K=5 or 6, Problem 1, 5, and 6 will be for ARCs, Problem 2, 3, and 4 will be for ABCs, and the objective is achieved.
Thus, the answer is 2.

Sample Input 2

8
9 1 14 5 5 4 4 14

Sample Output 2

0

There may be no choice of the integer K that make the number of problems for ARCs and the number of problems for ABCs the same.

Sample Input 3

14
99592 10342 29105 78532 83018 11639 92015 77204 30914 21912 34519 80835 100000 1

Sample Output 3

42685

Solution in Rust (1.15.1) (judge verdict: Time Limit Exceeded)

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}

fn partition(v: &mut Vec<i32>, p: i32, r: i32) -> i32 {
    let x = v[r as usize];
    let mut i = p - 1;
    for j in p..r {
        if v[j as usize] <= x {
            i += 1;
            let tmp = v[i as usize];
            v[i as usize] = v[j as usize];
            v[j as usize] = tmp
        }
    }
    let tmp = v[(i + 1) as usize];
    v[(i + 1) as usize] = v[r as usize];
    v[r as usize] = tmp;
    i + 1
}
/*
fn quicksort(v: &mut Vec<i32>, p: i32, r: i32) {
    if p < r {
        let q = partition(v, p, r);
        quicksort(v, p, q - 1);
        quicksort(v, q + 1, r);
    }
}
*/
fn search(v: &mut Vec<i32>, p:i32,r:i32,i:i32) -> i32{
    if p<r{
        let q = partition(v, p, r);
        if q == i {
            v[i as usize]
        }else if q>i{
            search(v, p, q-1, i)
        }else{
            search(v, q+1, r, i)
        }
    }else{
        v[p as usize]
    }
}

fn main() {
    let n: i32 = read();
    let m = n / 2;
    let mut d1: Vec<i32> = read_vec();
    let mut d2 = d1.clone();

    let a = search(&mut d1, 0, n-1, m-1);
    let b = search(&mut d2, 0, n-1, m);

    println!("{}", b-a);
}