#include <bits/stdc++.h>
using namespace std;
const int inf = (int)1e9 + 9;
void chkmx(int& a, int b) {
  if (a < b) a = b;
}
int bit(int mask, int k) { return (mask >> k) & 1; }
int nonzero(int x) { return x > 0; }
void add_matches(int w, int l, int val, vector<pair<int, int> >& out) {
  for (int nl = w / 2; nl <= w - w / 2; ++nl) {
    out.push_back({(w - nl) + 2 * nonzero(l + nl),
                   val + nonzero(w) + nonzero(l) + nonzero(l + nl)});
  }
}
struct State {
  int a[3][3];
  State() {
    for (int w = 0; w < 3; ++w)
      for (int l = 0; l < 3; ++l) a[w][l] = -inf;
  }
  State(int p1, int p2) {
    for (int w = 0; w < 3; ++w)
      for (int l = 0; l < 3; ++l) a[w][l] = -inf;
    int interest = nonzero(p1) + nonzero(p2);
    for (int w1 = p1 / 2; w1 <= p1 - p1 / 2; ++w1)
      for (int w2 = p2 / 2; w2 <= p2 - p2 / 2; ++w2)
        a[w1 + w2][p1 - w1 + p2 - w2] = interest;
  }
  vector<pair<int, int> > matches() {
    vector<pair<int, int> > res;
    for (int w = 0; w < 3; ++w)
      for (int l = 0; l < 3; ++l) add_matches(w, l, a[w][l], res);
    return res;
  }
  State operator+(State& I) {
    vector<pair<int, int> > m = matches();
    vector<pair<int, int> > Im = I.matches();
    State res;
    for (auto& [mask, val] : m) {
      for (auto& [Imask, Ival] : Im)
        chkmx(res.a[bit(mask, 0) + bit(Imask, 0)][bit(mask, 1) + bit(Imask, 1)],
              val + Ival);
    }
    return res;
  }
  int ans() {
    vector<pair<int, int> > m = matches();
    int res = -inf;
    for (auto& [mask, val] : m) {
      chkmx(res, val + nonzero(mask));
    }
    return res;
  }
};
int main() {
  int n, k;
  scanf("%d %d", &n, &k);
  if (n == 1) {
    printf("%d\n", (int)(k > 0));
    return 0;
  }
  vector<int> good(1 << n, 0);
  while (k--) {
    int x;
    scanf("%d", &x);
    --x;
    good[x] = 1;
  }
  vector<State> dp;
  for (int i = 0; i < (1 << n); i += 4) {
    dp.push_back(State(good[i] + good[i + 1], good[i + 2] + good[i + 3]));
  }
  while ((int)(dp).size() > 1) {
    vector<State> newdp;
    for (int i = 0; i < (int)(dp).size(); i += 2)
      newdp.push_back(dp[i] + dp[i + 1]);
    dp = newdp;
  }
  printf("%d\n", dp[0].ans());
}
