#include <bits/stdc++.h>
using namespace std;
const long long oo = 1e18;
const long long MAXN = 2e5 + 100;
bool A[MAXN];
long long N, K;
long long DP[MAXN][2][2];
bool mk[MAXN][2][2];
void F(long long nodo, long long l, long long r) {
  if (l + 1 == r) {
    if (A[l] || A[r]) {
      DP[nodo][A[l]][A[r]] = 1;
      mk[nodo][A[l]][A[r]] = true;
      DP[nodo][A[r]][A[l]] = 1;
      mk[nodo][A[r]][A[l]] = true;
    } else {
      mk[nodo][0][0] = true;
    }
    return;
  }
  long long mid = (l + r) / 2;
  F(nodo * 2, l, mid);
  F(nodo * 2 + 1, mid + 1, r);
  for (long long x = 0; x < 2; x++) {
    for (long long y = 0; y < 2; y++) {
      for (long long a = 0; a < 2; a++) {
        for (long long b = 0; b < 2; b++) {
          if (mk[nodo * 2][x][y] && mk[nodo * 2 + 1][a][b])
            DP[nodo][x][a] =
                max(DP[nodo][x][a], DP[nodo * 2][x][y] +
                                        DP[nodo * 2 + 1][a][b] + x * 1 + a * 2),
            mk[nodo][x][a] = true;
          if (mk[nodo * 2][x][y] && mk[nodo * 2 + 1][a][b])
            DP[nodo][x][y] =
                max(DP[nodo][x][y], DP[nodo * 2][x][y] +
                                        DP[nodo * 2 + 1][a][b] + x * 1 + y * 2),
            mk[nodo][x][y] = true;
          if (mk[nodo * 2][x][y] && mk[nodo * 2 + 1][a][b])
            DP[nodo][x][b] =
                max(DP[nodo][x][b], DP[nodo * 2][x][y] +
                                        DP[nodo * 2 + 1][a][b] + x * 1 + b * 2),
            mk[nodo][x][b] = true;
          if (mk[nodo * 2][x][y] && mk[nodo * 2 + 1][a][b])
            DP[nodo][a][x] =
                max(DP[nodo][a][x], DP[nodo * 2][x][y] +
                                        DP[nodo * 2 + 1][a][b] + a * 1 + x * 2),
            mk[nodo][a][x] = true;
          if (mk[nodo * 2][x][y] && mk[nodo * 2 + 1][a][b])
            DP[nodo][a][y] =
                max(DP[nodo][a][y], DP[nodo * 2][x][y] +
                                        DP[nodo * 2 + 1][a][b] + a * 1 + y * 2),
            mk[nodo][a][y] = true;
          if (mk[nodo * 2][x][y] && mk[nodo * 2 + 1][a][b])
            DP[nodo][a][b] =
                max(DP[nodo][a][b], DP[nodo * 2][x][y] +
                                        DP[nodo * 2 + 1][a][b] + a * 1 + b * 2),
            mk[nodo][a][b] = true;
        }
      }
    }
  }
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> N >> K;
  for (long long i = 1; i <= K; i++) {
    long long n;
    cin >> n;
    A[n] = true;
  }
  F(1, 1, 1 << N);
  long long res = 0;
  if (mk[1][0][0]) {
    res = max(res, DP[1][0][0]);
  }
  if (mk[1][0][1]) {
    res = max(res, DP[1][0][1] + 1);
  }
  if (mk[1][1][0]) {
    res = max(res, DP[1][1][0] + 1);
  }
  if (mk[1][1][1]) {
    res = max(res, DP[1][1][1] + 1);
  }
  cout << res << '\n';
  return 0;
}
