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 Python (3.4.3) (judge verdict: Time Limit Exceeded)

from itertools import combinations

def count(x1,y1,x2,y2):
    res = 0
    for i in range(N):
        s1 = x[i]
        s2 = y[i]
        if x1 <= s1 <= x2 and y1 <= s2 <= y2:
            res += 1
    return res 

    
N,K = map(int,input().split())

x = []
y = []
y_dict = {}

for i in range(N):
    a,b = map(int,input().split())
    x.append(a)
    y.append(b)
    y_dict[a] = b

number = [i for i in range(N)]
x_2 = sorted(x)
ans = 10**20

for i,j in list(combinations(number,2)):
#for i in range(len(x_2)-1):#長方系の左の辺をx座標を取得し,固定
#    for j in range(i+1,len(x_2)):#長方形の右の辺のx座標を取得し,固定

    y_list = []

    for k in range(i,j+1):#xの指定区間内にある点のy座標を取得しy_listに入れる
        y_list.append(y_dict[x_2[k]])
        
    y_list = sorted(y_list)
        

    if 2 <= len(y_list):
        #for l in range(len(y_list)-1):#yの大きい値から順に組み合わせを試す
            #for m in range(l+1,len(y_list)):
        number2 = [i for i in range(len(y_list))]
        for l,m in list(combinations(number2,2)):        
                x1 = x_2[i]
                y1 = y_list[l]
                x2 = x_2[j]
                y2 = y_list[m]
                point = count(x1,y1,x2,y2)#区間内の点の数
                
                    
                if K <= point :
                    ans = min(ans,(x2-x1)*(y2-y1)) 


               
print(ans)