#include <bits/stdc++.h>
using namespace std;
const int maxn = 200009;
const long long MOD = 119 << 23 | 1;
class {
 public:
  struct N {
    N(int a, int b, int c, int d) {
      sta[0] = a;
      sta[1] = b;
      sta[2] = c;
      sta[3] = d;
    }
    int sta[4];
  };
  int f[1 << 18];
  int trans[4][4][4] = {0,  -1, -1, -1, 1,  2,  -1, -1, 2,  2,  1,  -1, 3,
                        3,  3,  3,  1,  2,  -1, -1, 2,  2,  -1, -1, 3,  3,
                        3,  3,  -1, 3,  3,  3,  2,  2,  1,  -1, 3,  3,  3,
                        3,  -1, -1, 2,  2,  -1, -1, 3,  3,  3,  3,  3,  3,
                        -1, 3,  3,  3,  -1, -1, 3,  3,  -1, -1, -1, 3};
  N gao(N x, N y) {
    N res = {-MOD, -MOD, -MOD, -MOD};
    for (int i = 0; i < 4; ++i) {
      for (int j = 0; j < 4; ++j) {
        for (int k = 0; k < 4; k++) {
          if (trans[i][j][k] != -1) {
            res.sta[k] = max(res.sta[k], x.sta[i] + y.sta[j] + trans[i][j][k]);
          }
        }
      }
    }
    return res;
  }
  void solve() {
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < k; ++i) {
      int t;
      cin >> t;
      f[t]++;
    }
    vector<N> F;
    for (int i = 1; i <= (1 << n); i += 2) {
      if (f[i] + f[i + 1] == 2) {
        F.push_back(N(-MOD, -MOD, -MOD, 1));
      } else if (f[i] + f[i + 1]) {
        F.push_back(N(-MOD, 1, 1, -MOD));
      } else {
        F.push_back(N(0, -MOD, -MOD, -MOD));
      }
    }
    while (F.size() != 1) {
      vector<N> G;
      for (int i = 0; i < F.size(); i += 2) {
        G.push_back(gao(F[i], F[i + 1]));
      }
      swap(G, F);
    }
    cout << max(max(F[0].sta[0], F[0].sta[1] + 1),
                max(F[0].sta[2] + 1, F[0].sta[3] + 1))
         << "\n";
  }
} NSPACE;
int main() {
  ;
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  NSPACE.solve();
}
