#include <bits/stdc++.h>
using namespace std;
bool usuniete[100005];
int main() {
  int(n), (k);
  scanf("%d%d", &(n), &(k));
  ;
  vector<pair<int, int> > mX;
  vector<pair<int, int> > mY;
  for (int i = (0); i < (n); ++i) {
    int(x1), (y1);
    scanf("%d%d", &(x1), &(y1));
    ;
    int(x2), (y2);
    scanf("%d%d", &(x2), &(y2));
    ;
    mX.push_back(make_pair(x1 + x2, i));
    mY.push_back(make_pair(y1 + y2, i));
  }
  sort((mX).begin(), (mX).end());
  sort((mY).begin(), (mY).end());
  long long int dis1 = max((mY.back().first - mY[0].first) * 1LL, 1LL);
  long long int dis2 = max((mX.back().first - mX[0].first) * 1LL, 1LL);
  long long int best = ((dis1 + 1) / 2LL) * ((dis2 + 1) / 2LL);
  for (int i = (0); i < (n); ++i) usuniete[i] = false;
  for (int a = (0); a < (11); ++a)
    for (int b = (0); b < (11); ++b)
      for (int c = (0); c < (11); ++c)
        for (int d = (0); d < (11); ++d) {
          if (a + b + c + d > k) continue;
          vector<int> dupa;
          int i = 0, j = 0;
          while (j < a) {
            if (!usuniete[mX[i].second]) {
              usuniete[mX[i].second] = 1;
              dupa.push_back(mX[i].second);
              j++;
            }
            i++;
          }
          i = 0, j = 0;
          while (j < c) {
            if (!usuniete[mY[i].second]) {
              usuniete[mY[i].second] = 1;
              dupa.push_back(mY[i].second);
              j++;
            }
            i++;
          }
          i = n - 1, j = 0;
          while (j < b) {
            if (!usuniete[mX[i].second]) {
              usuniete[mX[i].second] = 1;
              dupa.push_back(mX[i].second);
              j++;
            }
            i--;
          }
          i = n - 1, j = 0;
          while (j < d) {
            if (!usuniete[mY[i].second]) {
              usuniete[mY[i].second] = 1;
              dupa.push_back(mY[i].second);
              j++;
            }
            i--;
          }
          long long int x1 = 0, x2 = mX.back().first;
          long long int y1 = 0, y2 = mY.back().first;
          for (int i = (0); i < (n); ++i) {
            if (!usuniete[mX[i].second]) {
              x1 = mX[i].first;
              break;
            }
          }
          for (int i = (0); i < (n); ++i) {
            if (!usuniete[mY[i].second]) {
              y1 = mY[i].first;
              break;
            }
          }
          for (int i = (n - 1); i >= (0); --i) {
            if (!usuniete[mX[i].second]) {
              x2 = mX[i].first;
              break;
            }
          }
          for (int i = (n - 1); i >= (0); --i) {
            if (!usuniete[mY[i].second]) {
              y2 = mY[i].first;
              break;
            }
          }
          dis1 = max(y2 - y1, 1LL);
          dis2 = max(x2 - x1, 1LL);
          best = min(best, ((dis1 + 1LL) / 2LL) * ((dis2 + 1LL) / 2LL));
          for (int i = (0); i < (dupa.size()); ++i) usuniete[dupa[i]] = false;
        }
  printf("%I64d\n", best);
}
