#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1 << 18;
const long long INF = 0x3f3f3f3f;
int n, k;
bool fav[MAXN];
long long dp[MAXN][18][2][2];
inline void get_max(long long &, long long);
int main() {
  scanf("%d%d", &n, &k);
  for (register int i = 1; i <= k; ++i) {
    int tmp;
    scanf("%d", &tmp);
    fav[tmp - 1] = true;
  }
  for (int k = 0; k < (1 << n); ++k)
    for (int t = 1; t <= n; ++t)
      for (int a = 0; a <= 1; ++a)
        for (int b = 0; b <= 1; ++b) dp[k][t][a][b] = -INF;
  for (int i = 0; i < (1 << n - 1); ++i)
    dp[i][1][fav[i << 1]][fav[i << 1 | 1]] =
        dp[i][1][fav[i << 1 | 1]][fav[i << 1]] = fav[i << 1] | fav[i << 1 | 1];
  for (int t = 2; t <= n; ++t)
    for (int k = 0; k < (1 << n - t); ++k) {
      for (register int a = 0; a <= 1; ++a)
        for (register int b = 0; b <= 1; ++b)
          for (register int c = 0; c <= 1; ++c)
            for (register int d = 0; d <= 1; ++d) {
              get_max(dp[k][t][a][c],
                      dp[k << 1][t - 1][a][b] + dp[k << 1 | 1][t - 1][c][d] +
                          (a | c) + (b | d) + max(c | b, c | d));
              get_max(dp[k][t][a][b], dp[k << 1][t - 1][a][b] +
                                          dp[k << 1 | 1][t - 1][c][d] +
                                          (a | c) + (b | d) + (b | c));
              get_max(dp[k][t][a][d], dp[k << 1][t - 1][a][b] +
                                          dp[k << 1 | 1][t - 1][c][d] +
                                          (a | c) + (b | d) + (d | c));
              get_max(dp[k][t][c][a],
                      dp[k << 1][t - 1][a][b] + dp[k << 1 | 1][t - 1][c][d] +
                          (a | c) + (b | d) + max(a | b, a | d));
              get_max(dp[k][t][c][b], dp[k << 1][t - 1][a][b] +
                                          dp[k << 1 | 1][t - 1][c][d] +
                                          (a | c) + (b | d) + (a | b));
              get_max(dp[k][t][c][d], dp[k << 1][t - 1][a][b] +
                                          dp[k << 1 | 1][t - 1][c][d] +
                                          (a | c) + (b | d) + (a | d));
            }
    }
  printf("%lld\n", max(max(dp[0][n][0][0], dp[0][n][0][1] + 1),
                       max(dp[0][n][1][0] + 1, dp[0][n][1][1] + 1)));
  return 0;
}
inline void get_max(long long &a, long long b) { a = max(a, b); }
