#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline long long read() {
  char c = getchar();
  long long tot = 1;
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    tot = -1;
    c = getchar();
  }
  long long sum = 0;
  while (c >= '0' && c <= '9') {
    sum = sum * 10 + c - '0';
    c = getchar();
  }
  return sum * tot;
}
inline void wr(long long x) {
  if (x < 0) {
    putchar('-');
    wr(-x);
    return;
  }
  if (x >= 10) wr(x / 10);
  putchar(x % 10 + '0');
}
inline void wrn(long long x) {
  wr(x);
  putchar('\n');
}
inline void wri(long long x) {
  wr(x);
  putchar(' ');
}
inline void wrn(long long x, long long y) {
  wri(x);
  wrn(y);
}
inline void wrn(long long a, long long b, long long c) {
  wri(a);
  wrn(b, c);
}
long long n, k, su[700055], f[700055][4], vis[700055], ans;
void solve(long long x, long long l, long long r) {
  if (su[r] - su[l - 1] == 0) {
    f[x][0] = 0;
    f[x][1] = f[x][2] = f[x][3] = -1000000000005;
    return;
  }
  if (r - l == 0) {
    f[x][0] = f[x][1] = f[x][2] = 0;
    f[x][3] = -1000000000005;
    return;
  }
  long long mid = (l + r) >> 1;
  solve(x * 2, l, mid);
  solve(x * 2 + 1, mid + 1, r);
  for (long long i = (0); i <= (3); i++) f[x][i] = -1000000000005;
  long long lx = x * 2, rx = x * 2 + 1, ss = r - l + 1;
  for (long long i = (0); i <= (3); i++) {
    for (long long j = (0); j <= (3); j++) {
      long long t = 0;
      if ((i | j) & 1 && ss > 2) t++;
      if (((i | j) & 2) && ss > 2) t += 2;
      f[x][i | j] = max(f[x][i | j], f[lx][i] + f[rx][j] + t);
    }
  }
}
signed main() {
  n = read();
  k = read();
  n = (1 << n);
  for (long long i = (1); i <= (k); i++) vis[read()] = 1;
  for (long long i = (1); i <= (n); i++) su[i] = su[i - 1] + vis[i];
  solve(1, 1, n);
  for (long long i = (0); i <= (3); i++) ans = max(ans, f[1][i]);
  for (long long i = (1); i <= (n / 2); i++) {
    if (vis[i * 2] | vis[i * 2 - 1]) ans++;
  }
  if (k == 0)
    wrn(0);
  else
    wrn(ans + 1);
  return 0;
}
