Problem: 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.

Examples

Input

4 4
1 4
3 3
6 2
8 1


Output

21


Input

4 2
0 0
1 1
2 2
3 3


Output

1


Input

4 3
-1000000000 -1000000000
1000000000 1000000000
-999999999 999999999
999999999 -999999999


Output

3999999996000000001

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static final long mod = (long)1e9+7;
    public static final long inf = Long.MAX_VALUE;

    static void solve(InputReader in, PrintWriter out){
        int n = in.ni(), k = in.ni();
        point[] px = new point[n];
        point[] py = new point[n];
        for(int i = 0; i < n; i++) {
            long x = in.nl(), y = in.nl();
            px[i] = new point(x, y, true);
            py[i] = new point(x, y, false);
        }
        Arrays.sort(px);
        Arrays.sort(py);
        long min = inf;
        for(int i = 0; i < n; i++) {
            for(int j = i+1; j < n; j++) {
                long x1 = px[i].x, y1 = px[i].y;
                long x2 = px[j].x, y2 = px[j].y;
                if(k == 2){
                    min = Math.min(min, (x2-x1)*Math.abs(y1-y2));
                }else{
                    for(int s = 0; s < n; s++) {
                        long x3 = py[s].x, y3 = py[s].y;
                        if(x3<=x1||x3>=x2) continue;
                        if(k == 3){
                            min = Math.min(min, (x2-x1)*((Math.max(Math.max(y1, y2), y3))-Math.min(Math.min(y1,y2),y3)));
                        }else{
                            long y4;
                            int count = 3;
                            for(int t = s+1; t < n; t++) {
                                if(py[t].x<=x1||py[t].x>=x2) continue;
                                if(count == k-1){
                                    y4 = py[t].y;
                                    min = Math.min(min, (x2-x1)*(Math.max(Math.max(y1, y2), Math.max(y3, y4))-Math.min(Math.min(y1,y2),Math.min(y3, y4))));
                                }else{
                                    count++;
                                }
                            }
                        }
                    }
                }
            }
        }
        out.println(min);
    }
    public static class point implements Comparable<point>{
        long x, y;
        boolean sort;
        public point(long x, long y, boolean sort){
            this.x = x;
            this.y = y;
            this.sort = sort;
        }
        @Override
        public int compareTo(point o) {
            if(this.sort){
                return (this.x>o.x)?1:-1;
            }else{
                return (this.y>o.y)?1:-1;
            }
        }
    }

    public static void main(String[] args) throws Exception{
        InputReader in = new InputReader(System.in);
        PrintWriter out = new PrintWriter(System.out);
        solve(in, out);
        out.close();
    }
    public static class InputReader{
        private BufferedReader br;
        private StringTokenizer st;
        public InputReader(InputStream is){
            br = new BufferedReader(new InputStreamReader(is));
            st = null;
        }
        public String ns(){
            if(st == null || !st.hasMoreTokens()){
                try{
                    st = new StringTokenizer(br.readLine());
                }catch (Exception e){
                    throw new RuntimeException(e);
                }
            }
            return st.nextToken();
        }
        public long nl(){
            return Long.parseLong(ns());
        }
        public int ni(){
            return Integer.parseInt(ns());
        }
        public Double nd(){
            return Double.parseDouble(ns());
        }
        public int[] ni(int n){
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = ni();
            }
            return a;
        }
        public long[] nl(int n){
            long[] a = new long[n];
            for (int i = 0; i < n; i++) {
                a[i] = nl();
            }
            return a;
        }
        public double[] nd(int n){
            double[] a = new double[n];
            for (int i = 0; i < n; i++) {
                a[i] = nd();
            }
            return a;
        }
    }
}