#include <bits/stdc++.h>
using namespace std;
int n;
int k;
vector<long long int> X;
vector<long long int> Y;
long long int ar[4000002];
int cnt[4000002];
struct st {
  int x;
  long long int mul;
  int ind;
  st(int x_, int ind_, long long int mul_) {
    x = x_;
    ind = ind_;
    mul = mul_;
  }
};
vector<pair<int, int> > v;
vector<st> V[300002];
vector<int> vv[300002];
long long int bit[300002];
void add(int b, int x) {
  b++;
  while (b < 300002) {
    bit[b] += x;
    b += b & -b;
  }
}
long long int sum(int b) {
  long long int r = 0;
  b++;
  while (b) {
    r += bit[b];
    b -= b & -b;
  }
  return r;
}
bool canx[100002];
bool cany[100002];
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 0; i < n; i++) {
    int a, b, c, d;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    X.push_back(a + c);
    Y.push_back(b + d);
    v.push_back(make_pair(a + c, b + d));
  }
  X.push_back(0);
  Y.push_back(0);
  sort(X.begin(), X.end());
  X.push_back(X.back() + 2);
  X.erase(unique(X.begin(), X.end()), X.end());
  sort(Y.begin(), Y.end());
  Y.push_back(Y.back() + 2);
  Y.erase(unique(Y.begin(), Y.end()), Y.end());
  int xx = X.size();
  int yy = Y.size();
  int lx = min(xx, k + 22);
  int rx = max((int)(X.size()) - k - 22, 0);
  int ly = min(yy, k + 22);
  int ry = max((int)(Y.size()) - k - 22, 0);
  int siz = 0;
  for (int i = 0; i < n; i++) {
    int f = v[i].first;
    int ind = lower_bound(X.begin(), X.end(), f) - X.begin();
    if (ind && X[ind - 1] != v[i].first - 2) {
      canx[ind] = true;
    } else {
      if (ind + 1 == X.size() || X[ind + 1] != f + 2) {
        canx[ind] = true;
      }
    }
    f = v[i].second;
    ind = lower_bound(Y.begin(), Y.end(), f) - Y.begin();
    if (ind && Y[ind - 1] != v[i].first - 2) {
      cany[ind] = true;
    } else {
      if (ind + 1 == Y.size() || Y[ind + 1] != f + 2) {
        cany[ind] = true;
      }
    }
  }
  for (int i = 0; i < lx; i++) {
    for (int j = 0; j < ly; j++) {
      for (int k = max(i, rx); k < xx; k++) {
        if (k == i && canx[k] == false) {
          continue;
        }
        for (int kk = max(j, ry); kk < yy; kk++) {
          if (kk == j && cany[kk] == false) {
            continue;
          }
          ar[siz] = max(2LL, (X[k] - X[i])) * max(2LL, (Y[kk] - Y[j]));
          int x1 = i;
          int y1 = j;
          int x2 = k;
          int y2 = kk;
          V[y2].push_back(st(x2, siz, 1));
          if (y1) {
            V[y1 - 1].push_back(st(x1 - 1, siz, 1));
            V[y1 - 1].push_back(st(x2, siz, -1));
          }
          if (x1) {
            V[y2].push_back(st(x1 - 1, siz, -1));
          }
          siz++;
        }
      }
    }
  }
  for (int i = 0; i < v.size(); i++) {
    int ind = lower_bound(Y.begin(), Y.end(), v[i].second) - Y.begin();
    vv[ind].push_back(lower_bound(X.begin(), X.end(), v[i].first) - X.begin());
  }
  for (int i = 0; i < Y.size(); i++) {
    for (int j = 0; j < vv[i].size(); j++) {
      add(vv[i][j], 1);
    }
    for (int j = 0; j < V[i].size(); j++) {
      cnt[V[i][j].ind] += sum(V[i][j].x) * V[i][j].mul;
    }
  }
  long long int mint = LLONG_MAX;
  for (int i = 0; i < siz; i++) {
    if (n - cnt[i] <= k) {
      mint = min(mint, ar[i]);
    }
  }
  long long int s = mint / 4LL;
  printf("%lld", s);
  mint %= 4LL;
  if (mint) {
    printf(".");
    mint *= 1000000LL;
    mint /= 4LL;
    printf("%lld", mint);
  }
  puts("");
  return 0;
}
