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;

#define rep2(x,fr,to) for(int (x)=(fr);(x)<(to);(x)++)
#define rep(x,to) for(int (x)=0;(x)<(to);(x)++)
#define repr(x,fr,to) for(int (x)=(fr);(x)>=(to);(x)--)
#define all(c) (c).begin(),(c).end()
#define sz(v) (int)(v).size()

typedef int64_t ll; typedef vector<int> VI; typedef pair<int,int> pii;
const ll mod = 1e9+7;


int main()
{

	//cin.tie(0); ios_base::sync_with_stdio(false);
	int n,k;
	cin >>n >>k;
	VI x(n), y(n);
	rep(i,n) cin >> x[i] >>y[i];
	vector<pii> xy(n);
	rep(i,n) xy[i] = pii(x[i],y[i]);
	sort(all(xy));
	
	vector<ll> xx(n), yy(n);
	rep(i,n) xx[i] = x[i];
	rep(i,n) yy[i] =y[i];
	sort(all(xx));
	sort(all(yy));
	xx.erase(unique(all(xx)), xx.end());
	yy.erase(unique(all(yy)), yy.end());
	ll ans =1LL<<62;
	rep(i,sz(xx)) rep2(j,i, sz(xx)){
		rep(iy,sz(yy)) rep2(jy,iy,sz(yy)){
			int sm =0;
			rep(k,n){
				if(xx[i] <= xy[k].first && xy[k].first <= xx[j] &&
				   yy[iy] <= xy[k].second && xy[k].second <= yy[jy]) sm++;
			}
			if(sm >=k){
				ans = min(ans, ((ll)xx[j]-xx[i])*((ll)yy[jy]-yy[iy]));
				//printf("%d:%d:%d:%d  \n",xx[i],xx[j],yy[iy],yy[jy]);
			} 
		}
	}
	
	cout << ans <<"\n";
	return 0;

}