#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void rd(T &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 - '0' + c, c = getchar();
  x *= f;
}
template <class T>
inline void cmax(T &x, T y) {
  if (x < y) x = y;
}
const int N = (1 << 18) + 10;
int f[N][2][2];
int vis[N];
void solve(int l, int r, int c) {
  if (l + 1 == r) {
    int x = vis[l], y = vis[r];
    cmax(f[c][x][y], x | y);
    cmax(f[c][y][x], x | y);
    return;
  }
  int mid = l + r >> 1;
  solve(l, mid, c << 1), solve(mid + 1, r, c << 1 | 1);
  for (int lx = 0; lx < 2; ++lx)
    for (int ly = 0; ly < 2; ++ly)
      if (f[c << 1][lx][ly] >= 0)
        for (int rx = 0; rx < 2; ++rx)
          for (int ry = 0; ry < 2; ++ry)
            if (f[c << 1 | 1][rx][ry] >= 0) {
              for (int S = 0; S < 8; ++S) {
                int a = (S & 1 ? lx : rx);
                int b = (S & 2 ? ly : ry);
                int d = (S & 4 ? (lx ^ rx ^ a) : b);
                cmax(f[c][a][d], f[c << 1][lx][ly] + f[c << 1 | 1][rx][ry] +
                                     (lx | rx) + (ly | ry) +
                                     ((lx ^ rx ^ a) | b));
              }
            }
}
int main() {
  int n, k;
  rd(n), rd(k);
  for (int i = 1, x; i <= k; ++i) rd(x), vis[x - 1] = 1;
  memset(f, -0x3f, sizeof(f));
  solve(0, (1 << n) - 1, 1);
  int ans = -0x3f3f3f3f;
  for (int x = 0; x < 2; ++x)
    for (int y = 0; y < 2; ++y) cmax(ans, f[1][x][y] + (x | y));
  printf("%d", ans);
  return 0;
}
