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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int INF = 1e9;
const ll LINF = LLONG_MAX;

/*
<url:https://abc075.contest.atcoder.jp/tasks/abc075_d>
問題文============================================================
 2次元座標上に N 個の点があります。
 i(1≦i≦N) 番目の点の座標は (xi,yi) です。
 長方形の内部に N 点のうち K 個以上の点を含みつつ、それぞれの辺がX軸かY軸に平行な長方形を考えます。
 このとき、長方形の辺上の点は長方形の内部に含みます。
 それらの長方形の中で、最小の面積となるような長方形の面積を求めてください。
=================================================================

解説=============================================================

================================================================
*/
int main(void) {
	cin.tie(0); ios::sync_with_stdio(false);
    ll N,K; cin >> N >> K;
    vector<pll> ps(N);
    vector<ll> X(N),Y(N);
    for(int i = 0; i < N;i++){
        cin >> ps[i].first >> ps[i].second;
        X[i] = ps[i].first; Y[i] = ps[i].second;
    }
    sort(X.begin(),X.end()); sort(Y.begin(),Y.end());
    
    ll ans = LINF;
    for(int xi = 0; xi < N; xi++){
        for(int xj = xi + 1; xj < N; xj++){
            for(int yi = 0; yi < N; yi++){
                for(int yj = 0; yj < N; yj++){
                    
                    int cnt = 0;
                    
                    ll minx = X[xi], miny = Y[yi];
                    ll maxx = X[xj], maxy = Y[yj];
                    for(int k = 0; k < N;k++){
                        if(minx <= ps[k].first &&
                           ps[k].first <= maxx &&
                           miny <= ps[k].second &&
                           ps[k].second <= maxy)
                            cnt++;
                    }
                    if(cnt >= K){
                        ans = min(ans,(maxx-minx)*(maxy-miny));
                    }
                }
            }
        }
    }

    cout << ans << endl;
	return 0;
}