#include <bits/stdc++.h>
using namespace std;
uint64_t rnd_data = 0xDEADBEEFDULL;
inline void my_srand(int seed) { rnd_data = ((uint64_t)seed << 16) | 0x330E; }
inline int my_rand() {
  rnd_data = rnd_data * 0x5DEECE66DULL + 0xB;
  return (rnd_data >> 17) & 0x7FFFFFFF;
}
template <typename T>
void my_random_shuffle(T b, T e) {
  for (int i = (1); i <= (int)((int)(e - b) - 1); i++) {
    swap(b[i], b[my_rand() % (i + 1)]);
  }
}
template <class _T>
inline _T sqr(const _T &x) {
  return x * x;
}
template <typename type_t, typename less_t = std::less<type_t>>
inline bool uin(type_t &a, const type_t &b, const less_t &ls = less_t()) {
  return ls(b, a) ? a = b, true : false;
}
template <typename type_t, typename less_t = std::less<type_t>>
inline bool uax(type_t &a, const type_t &b, const less_t &ls = less_t()) {
  return ls(a, b) ? a = b, true : false;
}
const long double PI = 3.1415926535897932384626433832795L;
const long double EPS = 1e-9;
const int MAXN = 1 << 17;
int n, k;
int a[MAXN];
bool g[MAXN];
int d[MAXN * 2][2][2];
int main() {
  scanf("%d%d", &n, &k);
  memset((g), 0, sizeof(g));
  for (int i = 0; i < (int)(k); i++) {
    scanf("%d", &a[i]);
    g[a[i] - 1] = true;
  }
  memset(d, 0x80, sizeof(d));
  int z = 1 << (n - 1);
  for (int i = 0; i < (int)(z); i++) {
    int x = i << 1;
    int y = x + 1;
    d[z + i][g[x]][g[y]] = g[x] || g[y];
    d[z + i][g[y]][g[x]] = g[x] || g[y];
  }
  for (int i = (z - 1); i >= (int)(1); i--) {
    int x = i * 2;
    int y = x + 1;
    for (int xw = 0; xw < (int)(2); xw++) {
      for (int xl = 0; xl < (int)(2); xl++) {
        if (d[x][xw][xl] < 0) continue;
        for (int yw = 0; yw < (int)(2); yw++) {
          for (int yl = 0; yl < (int)(2); yl++) {
            if (d[y][yw][yl] < 0) continue;
            int gw[2] = {xw, yw};
            bool ggl = xl || yl;
            for (int t = 0; t < (int)(2); t++) {
              int cur = (xw || yw) + ggl;
              int nw = gw[t];
              int nl0 = gw[t ^ 1];
              int nl = nl0 || ggl;
              cur += nl;
              uax(d[i][nw][nl], d[x][xw][xl] + d[y][yw][yl] + cur);
            }
          }
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < (int)(2); i++) {
    for (int j = 0; j < (int)(2); j++) {
      int add = (i || j);
      uax(ans, d[1][i][j] + add);
    }
  }
  printf("%d\n", ans);
  return 0;
}
