#include <bits/stdc++.h>
int f[18][1 << 18][4];
int a[1 << 18];
int vis[4][4][4][4];
struct Element {
  int a, b, c;
  Element(int a, int b, int c) : a(a), b(b), c(c) {}
};
std::vector<Element> subTree[4];
void preWork() {
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      int u[2], v[2];
      u[0] = i % 2, u[1] = i / 2;
      v[0] = j % 2, v[1] = j / 2;
      for (int k = 0; k < (1 << 3); k++) {
        int a = 0, b = 0;
        int mask = k;
        int count = 0, nextMask = 0;
        for (int l = 0; l < 3; l++) {
          int cur = mask % 2;
          mask /= 2;
          if (l == 0) {
            if (u[0] || v[0]) count++;
            if (cur)
              nextMask = u[0], a = v[0];
            else
              nextMask = v[0], a = u[0];
          } else if (l == 1) {
            if (u[1] || v[1]) count++;
            if (cur)
              b = u[1];
            else
              b = v[1];
          } else {
            if (a || b) count++;
            if (cur)
              nextMask += 2 * a;
            else
              nextMask += 2 * b;
          }
        }
        if (!vis[nextMask][i][j][count]) {
          vis[nextMask][i][j][count] = 1;
          subTree[nextMask].push_back(Element(i, j, count));
        }
      }
    }
  }
}
int max(int a, int b) { return a > b ? a : b; }
int main() {
  preWork();
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 0; i < k; i++) {
    int u;
    scanf("%d", &u);
    a[u] = 1;
  }
  int total = (1 << n), inf = 1e8 + 7;
  for (int i = 1; i * 2 <= total; i++) {
    for (int j = 0; j < 4; j++) f[1][i][j] = -inf;
    int u = 2 * i - 1, v = 2 * i;
    if (!a[u] && !a[v])
      f[1][i][0] = 0;
    else if (a[u] && a[v])
      f[1][i][3] = 1;
    else
      f[1][i][2] = f[1][i][1] = 1;
  }
  for (int i = 2; i <= n; i++) {
    int now = 1 << i;
    for (int j = 1; j * now <= total; j++) {
      for (int k = 0; k < 4; k++) {
        f[i][j][k] = -inf;
        int u = 2 * j - 1, v = 2 * j;
        for (unsigned int l = 0; l < subTree[k].size(); l++) {
          Element e = subTree[k][l];
          f[i][j][k] =
              max(f[i][j][k], f[i - 1][u][e.a] + f[i - 1][v][e.b] + e.c);
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < 4; i++) {
    if (i != 0) f[n][1][i]++;
    ans = max(ans, f[n][1][i]);
  }
  printf("%d\n", ans);
  return 0;
}
