#include <bits/stdc++.h>
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:666000000")
using namespace std;
const int INF = (1 << 30) - 1;
const long double EPS = 1e-9;
void ML(const bool v) {
  if (v) return;
  int *ass;
  for (;;) {
    ass = new int[2500000];
    for (int i = 0; i < 2500000; i++) ass[i] = rand();
  }
}
void TL(const bool v) {
  if (v) return;
  for (;;) cout << rand() % (rand() % 1000 + 1) << endl;
}
void PE(const bool v) {
  if (v) return;
  for (int i = 0; i < 10000; i++) printf("%c", rand() % 256);
  exit(0);
}
int n, k;
vector<int> a;
bool LoAd() {
  if (!(2 == scanf("%d%d", &n, &k))) return false;
  a.resize(n);
  for (int i = 0; i < (int)(n); i++) (1 == scanf("%d", &a[i]));
  return true;
}
void SoLvE() {
  map<int, int> w;
  for (int i = 0; i < (int)(n); i++) w[a[i]]++;
  vector<int> b;
  for (auto it = (w).begin(); it != (w).end(); it++) b.push_back(it->second);
  int lt = 0;
  int rt = (int)b.size() - 1;
  k *= 8;
  a.clear();
  int difVals = (int)b.size();
  long long bps = (k) / n;
  long long can = 1;
  for (int i = 0; i < bps && can < n; i++) can *= 2;
  long long dropped = 0;
  while (rt - lt + 1 > can) {
    dropped += b[lt];
    lt++;
  }
  long long res = dropped;
  while (lt > 0) {
    lt--;
    dropped -= b[lt];
    dropped += b[rt];
    rt--;
    if (dropped < res) res = dropped;
  }
  cout << res << endl;
}
int main() {
  srand((int)time(NULL));
  LoAd();
  SoLvE();
  return 0;
}
