#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int s = 0, t = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') t = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
  return s * t;
}
const int N = (1 << 18) + 5;
int n, m, Ans, p[N], f[N][2][2];
void Solve(int x, int l, int r) {
  if (l + 1 == r) {
    int a = p[l], b = p[r];
    f[x][a][b] = f[x][b][a] = a | b;
    return;
  }
  int mid = (l + r) >> 1;
  Solve(x << 1, l, mid), Solve(x << 1 | 1, mid + 1, r);
  for (int a = 0; a < 2; a++)
    for (int b = 0; b < 2; b++)
      if (~f[x << 1][a][b])
        for (int c = 0; c < 2; c++)
          for (int d = 0; d < 2; d++)
            if (~f[x << 1 | 1][c][d]) {
              int t = f[x << 1][a][b] + f[x << 1 | 1][c][d] + (a | c) + (b | d),
                  B = b | d;
              f[x][a][B] = max(f[x][a][B], t + (c | B));
              f[x][a][c] = max(f[x][a][c], t + (c | B));
              f[x][c][B] = max(f[x][c][B], t + (a | B));
              f[x][c][a] = max(f[x][c][a], t + (a | B));
            }
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; i++) p[read()] = 1;
  memset(f, -1, sizeof(f));
  Solve(1, 1, (1 << n));
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++)
      if (~f[1][i][j]) Ans = max(Ans, f[1][i][j] + (i | j));
  cout << Ans;
  return 0;
}
