#include <bits/stdc++.h>
using namespace std;
template <class T>
void cmax(T& _, T __) {
  if (_ < __) _ = __;
}
template <class T>
void cmin(T& _, T __) {
  if (_ > __) _ = __;
}
namespace FastIO {
char ibf[1 << 20], d[42], *ip = ibf + 1, *t = ibf + 1, obf[1 << 17], *op = obf;
bool read(char* s) {
  char* tmp = s;
  while (t != ibf) {
    while (ip != t && *ip <= ' ') ip++;
    if (ip != t)
      break;
    else
      t = ibf + fread(ibf, 1, 1 << 20, stdin), ip = ibf;
  }
  while (t != ibf) {
    for (; ip<t&& * ip> ' '; ip++) *s++ = *ip;
    if (ip != t)
      break;
    else
      t = ibf + fread(ibf, 1, 1 << 20, stdin), ip = ibf;
  }
  *s = '\0';
  return s != tmp;
}
template <class T>
bool read(T& x) {
  if (!read(d)) {
    return false;
  }
  x = 0;
  for (char* p = d + (*d == '-'); *p;) x = x * 10 + ((*p++) ^ 48);
  if (*d == '-') {
    x = -x;
  }
  return true;
}
inline void flush() {
  if (op != obf) {
    fwrite(obf, 1, op - obf, stdout);
    op = obf;
  }
}
template <class T>
void print(T x) {
  if (x < 0) {
    *op++ = '-';
    x = -x;
  }
  if (x == 0) {
    *op++ = '0';
    return;
  }
  char* p = d;
  for (; x; x /= 10) *p++ = x % 10 + '0';
  while (p != d) {
    *op++ = *--p;
  }
  if ((op - obf) >= (1 << 17) - 70) {
    flush();
  }
}
inline void print(char* s) {
  while (*s != '\0') {
    *op++ = *s++;
    if ((op - obf) >= (1 << 17) - 70) {
      flush();
    }
  };
}
inline void print(char ch) {
  *op++ = ch;
  if ((op - obf) >= (1 << 17) - 70) {
    flush();
  }
}
inline void print(const char* s) {
  for (int i = 0; s[i]; i++) {
    if ((op - obf) >= (1 << 17) - 70) {
      flush();
    }
    *op++ = s[i];
  }
}
template <class T, class... Args>
inline bool read(T& x, Args&... r) {
  return read(x) && read(r...);
}
template <class T, class... Args>
inline void print(T x, Args... r) {
  print(x), print(r...);
}
template <class... Args>
inline void println(Args... r) {
  print(r...);
  print('\n');
}
}  // namespace FastIO
using namespace FastIO;
const int maxn = 18, INF = 0x3f3f3f3f;
const long long LINF = (long long)INF << 32 | INF, mod = 1e9 + 7;
int dp[maxn][1 << maxn][2][2];
bool fan[1 << maxn];
int main() {
  int n, k, tot;
  read(n, k);
  tot = 1 << n;
  for (int i = 0; i < (k); ++i) {
    int x;
    read(x);
    fan[x - 1] = true;
  }
  memset(dp, 0xC0, sizeof(dp));
  for (int i = 1; i <= (n); ++i)
    for (int j = 0; j < tot; j += 1 << i) {
      if (i == 1)
        for (int W = 0; W < (2); ++W)
          for (int L = 0; L < (2); ++L) {
            if (W + L == fan[j] + fan[j + 1])
              dp[i][j][W][L] = fan[j] | fan[j + 1];
          }
      else {
        for (int W1 = 0; W1 < (2); ++W1)
          for (int L1 = 0; L1 < (2); ++L1)
            for (int W2 = 0; W2 < (2); ++W2)
              for (int L2 = 0; L2 < (2); ++L2) {
                int c = dp[i - 1][j][W1][L1] +
                        dp[i - 1][j + (1 << (i - 1))][W2][L2];
                c += (W1 | W2) + (L1 | L2);
                auto& d = dp[i][j];
                cmax(d[W1][L1], c + (W2 | L1));
                cmax(d[W1][L2], c + (W2 | L2));
                cmax(d[W2][L1], c + (W1 | L1));
                cmax(d[W2][L2], c + (W1 | L2));
                cmax(d[W1][W2], c + (W2 | L1 | L2));
                cmax(d[W2][W1], c + (W1 | L1 | L2));
              }
      }
    }
  int ans = 0;
  for (int W = 0; W < (2); ++W)
    for (int L = 0; L < (2); ++L) cmax(ans, dp[n][0][W][L] + (L | W));
  println(ans);
  flush();
  return 0;
}
