Problem:
Score : 400 points

Problem Statement

We have N points in a two-dimensional plane.

The coordinates of the i-th point (1 \leq i \leq N) are (x_i,y_i).

Let us consider a rectangle whose sides are parallel to the coordinate axes that contains K or more of the N points in its interior.

Here, points on the sides of the rectangle are considered to be in the interior.

Find the minimum possible area of such a rectangle.

Constraints

2 \leq K \leq N \leq 50

-10^9 \leq x_i,y_i \leq 10^9 (1 \leq i \leq N)

x_i≠x_j (1 \leq i<j \leq N)

y_i≠y_j (1 \leq i<j \leq N)

All input values are integers. (Added at 21:50 JST)

Input

Input is given from Standard Input in the following format:

N K
x_1 y_1
:
x_{N} y_{N}

Output

Print the minimum possible area of a rectangle that satisfies the condition.

Sample Input 1

4 4
1 4
3 3
6 2
8 1

Sample Output 1

21

One rectangle that satisfies the condition with the minimum possible area has the following vertices: (1,1), (8,1), (1,4) and (8,4).

Its area is (8-1) × (4-1) = 21.

Sample Input 2

4 2
0 0
1 1
2 2
3 3

Sample Output 2

1

Sample Input 3

4 3
-1000000000 -1000000000
1000000000 1000000000
-999999999 999999999
999999999 -999999999

Sample Output 3

3999999996000000001

Watch out for integer overflows.

Solution in Rust (1.15.1) (judge verdict: Accepted)

#[allow(unused_macros)]
macro_rules! invec {
    ( $t:ty ) => {{
        let mut s = String::new();
        match std::io::stdin().read_line(&mut s) {
            Ok(0) => Vec::<$t>::new(),
            Ok(n) => s.trim().split_whitespace().map(|s| s.parse::<$t>().unwrap()).collect::<Vec<$t>>(),
            Err(_) => Vec::<$t>::new(),
        }
    }}
}

#[allow(unused_macros)]
macro_rules! input {
    ( $($t:ty),* ) => {{
        let mut s = String::new();
        std::io::stdin().read_line(&mut s);
        let mut splits = s.trim().split_whitespace();
        ($(
            {
                 splits.next().unwrap().parse::<$t>().unwrap()
            },
        )*)
    }}
}

#[allow(unused_must_use)]
#[allow(unused_variables)]
fn solve() {
    let (n, k) = input!(usize, i64);

    let mut loc = vec![];
    for _ in 0..n {
        let coordinate = input!(i64, i64);
        loc.push(coordinate);
    }

    let mut min_area = std::i64::MAX;
    for x1 in 0..n {
        for x2 in (x1 + 1)..n {
            for y1 in 0..n {
                for y2 in (y1 + 1)..n {
                    let mut count = 0;
                    let x_min = if loc[x1].0 < loc[x2].0 {
                        loc[x1].0
                    } else {
                        loc[x2].0
                    };
                    let x_max = if loc[x1].0 > loc[x2].0 {
                        loc[x1].0
                    } else {
                        loc[x2].0
                    };
                    let y_min = if loc[y1].1 < loc[y2].1 {
                        loc[y1].1
                    } else {
                        loc[y2].1
                    };
                    let y_max = if loc[y1].1 > loc[y2].1 {
                        loc[y1].1
                    } else {
                        loc[y2].1
                    };
                    for i in 0..n {
                        if x_min <= loc[i].0 && loc[i].0 <= x_max && y_min <= loc[i].1 &&
                            loc[i].1 <= y_max
                        {
                            count += 1;
                        }
                    }
                    if k <= count {
                        let area = (x_max - x_min) * (y_max - y_min);
                        if area < min_area {
                            min_area = area;
                        }
                    }
                }
            }
        }
    }

    println!("{}", min_area);
}

fn main() {
    solve();
}