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>
#include <complex>
#include <iomanip>
using namespace std;
#define reps(i,s,n) for(int i = s; i < n; i++)
#define rep(i,n) reps(i,0,n)
#define fi first
#define se second
#define mp make_pair
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;

ll N,M,H,W,K,Q,A,B,C,L,R;
string S,T;
const ll MOD = (1e+9) + 7;
const ll INF = 1LL << 60;
typedef pair<ll,ll> P;

typedef vector<P> vp;
typedef vector<vp> matP;

set<ll> s;
ll min_range(ll num){
    vec memo(num - K + 1, 0);
    auto ite = s.begin();
    auto rite = s.rbegin();
    rep(i,num - K + 1){
        memo[i] -= *ite;
        memo[num - K - i] += *rite;
        ++ite; ++rite;
    }
    ll res = 4e+18;
    rep(i,num - K + 1) res = min(res, memo[i]);
    return res;
}

int main() {
    cin>>N>>K;
    vp xy(N);
    rep(i,N) cin>>xy[i].fi>>xy[i].se;
    sort(xy.begin(), xy.end());
    ll ans = 4e+18;
    reps(num,K,N+1){ //x軸方向の点の数
        rep(i,num) s.insert(xy[i].se);
        ans = min(ans, min_range(num) * (xy[num - 1].fi - xy[0].fi));
        reps(i,1,N - num + 1){ //左端のindex
            s.erase(xy[i-1].se);
            s.insert(xy[num + i - 1].se);
            ans = min(ans, min_range(num) * (xy[num + i - 1].fi - xy[i].fi));
        }
        s.clear();
    }
    cout<<ans<<endl;
}