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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_VTX_MAX		50										// 最大座標数
#define D_MODE_X		0										// モード - Ｘ基準
#define D_MODE_Y		1										// モード - Ｙ基準

// 内部構造体 - 頂点情報
typedef struct Vtx {
	int miX;													// 座標Ⅹ
	int miY;													// 座標Ｙ
} Vtx;

// 内部変数
static Vtx sz1Vtx[D_VTX_MAX];									// 頂点情報
static int siVCnt;												// 頂点情報数
static int siNCnt;												// 必要頂点数
static long long slMin;											// 最小面積

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// ソート関数 - Ｘ座標昇順
int
fSortFncX(
	const void *pzpVal1			// <I> 値１
	, const void *pzpVal2		// <I> 値２
)
{
	Vtx *lzpVal1 = (Vtx *)pzpVal1;
	Vtx *lzpVal2 = (Vtx *)pzpVal2;

	// Ｘ座標昇順
	if (lzpVal1->miX > lzpVal2->miX) {
		return(1);
	}
	else if (lzpVal1->miX < lzpVal2->miX) {
		return(-1);
	}

	return 0;
}

// ソート関数 - Ｙ座標昇順
int
fSortFncY(
	const void *pzpVal1			// <I> 値１
	, const void *pzpVal2		// <I> 値２
)
{
	Vtx *lzpVal1 = (Vtx *)pzpVal1;
	Vtx *lzpVal2 = (Vtx *)pzpVal2;

	// Ｙ座標昇順
	if (lzpVal1->miY > lzpVal2->miY) {
		return(1);
	}
	else if (lzpVal1->miY < lzpVal2->miY) {
		return(-1);
	}

	return 0;
}

// 算出
int
fCalc(
	int piMode					// <I> モード
)
{
	int i;

	// ソート
	if (piMode == D_MODE_X) {
		qsort(sz1Vtx, siVCnt, sizeof(Vtx), fSortFncX);
	}
	else {
		qsort(sz1Vtx, siVCnt, sizeof(Vtx), fSortFncY);
	}

	// 初期化
	int liNoS = 0;
	int liNoE = 0;

	// 算出
	while (1) {

		// 必要頂点数
		if (liNoE - liNoS + 1 < siNCnt) {		// 不足

			// 頂点追加
			liNoE++;
			if (liNoE >= siVCnt) {					// 頂点なし
				break;
			}
		}
		else {									// OK

			// 基準座標範囲
			int liBS, liBE;
			if (piMode == D_MODE_X) {
				liBS = sz1Vtx[liNoS].miX;
				liBE = sz1Vtx[liNoE].miX;
			}
			else {
				liBS = sz1Vtx[liNoS].miY;
				liBE = sz1Vtx[liNoE].miY;
			}

			// もう一方の座標範囲
			int liOS = INT_MAX;
			int liOE = INT_MIN;
			for (i = liNoS; i <= liNoE; i++) {

				// 対象値
				int liVal;
				if (piMode == D_MODE_X) {
					liVal = sz1Vtx[i].miY;
				}
				else {
					liVal = sz1Vtx[i].miX;
				}

				// 更新
				if (liOS > liVal) {
					liOS = liVal;
				}
				if (liOE < liVal) {
					liOE = liVal;
				}
			}

			// 面積
			long long llArea = (long long)(liBE - liBS) * (long long)(liOE - liOS);
			if (slMin > llArea) {
				slMin = llArea;
			}

			// 頂点削除
			liNoS++;
		}
	}

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i;
	char lc1Buf[1024], lc1Out[1024];

	// データ初期化
	slMin = LLONG_MAX;											// 最小面積

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 頂点情報数・必要頂点数取得
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d%d", &siVCnt, &siNCnt);

	// 頂点情報取得
	for (i = 0; i < siVCnt; i++) {
#ifdef D_TEST
		fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
		fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
		sscanf(lc1Buf, "%d%d", &sz1Vtx[i].miX, &sz1Vtx[i].miY);
	}

	// 算出
	fCalc(D_MODE_X);
	fCalc(D_MODE_Y);

	// 結果セット
	sprintf(lc1Out, "%lld\n", slMin);

	// 結果表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}