#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
constexpr int MOD = 1000 * 1000 * 1000 + 7;
constexpr int ALPHABET_SIZE = 26;
constexpr ll INF = 1e18;
using state = tuple<int, int, int, int>;
int get_value(const state& st, int ind) {
  if (ind == 0) {
    return get<0>(st);
  }
  if (ind == 1) {
    return get<1>(st);
  }
  if (ind == 2) {
    return get<2>(st);
  }
  if (ind == 3) {
    return get<3>(st);
  }
  return -1;
}
void set_value(state& st, int ind, int val) {
  if (ind == 0) {
    get<0>(st) = val;
  }
  if (ind == 1) {
    get<1>(st) = val;
  }
  if (ind == 2) {
    get<2>(st) = val;
  }
  if (ind == 3) {
    get<3>(st) = val;
  }
}
void generate(size_t val1, size_t val2, vector<pair<int, int>>& res) {
  for (size_t mask = 0; mask < 8; ++mask) {
    bool m1 = ((mask & 1ul) == 1);
    bool m2 = ((mask & 2ul) == 2);
    bool m3 = ((mask & 4ul) == 4);
    int w1 = 0, l1 = 0, w2 = 0, l2 = 0;
    size_t count = 0;
    if (m1) {
      w1 = ((val1 & 1ul) == 1);
      l1 = ((val2 & 1ul) == 1);
    } else {
      w1 = ((val2 & 1ul) == 1);
      l1 = ((val1 & 1ul) == 1);
    }
    if (w1 > 0 || l1 > 0) {
      ++count;
    }
    if (m2) {
      w2 = ((val1 & 2ul) == 2);
      l2 = ((val2 & 2ul) == 2);
    } else {
      w2 = ((val2 & 2ul) == 2);
      l2 = ((val1 & 2ul) == 2);
    }
    if (w2 > 0 || l2 > 0) {
      ++count;
    }
    int w3 = 0;
    if (m3) {
      w3 = l1;
    } else {
      w3 = w2;
    }
    if (l1 > 0 || w2 > 0) {
      ++count;
    }
    size_t res_mask = 0;
    if (w1 > 0) {
      res_mask |= 1ul;
    }
    if (w3 > 0) {
      res_mask |= 2ul;
    }
    res.emplace_back(res_mask, count);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  size_t n, k;
  cin >> n >> k;
  size_t N = (1ul << n);
  vector<bool> interesting(N);
  for (size_t i = 0; i < k; ++i) {
    size_t x;
    cin >> x;
    --x;
    interesting[x] = true;
  }
  vector<vector<state>> dp;
  dp.emplace_back();
  auto& v = dp.back();
  for (size_t i = 0; i < N; i += 2) {
    bool a = interesting[i], b = interesting[i + 1];
    if (a && b) {
      v.emplace_back(-1, -1, -1, 1);
    }
    if (a && !b) {
      v.emplace_back(-1, 1, 1, -1);
    }
    if (!a && b) {
      v.emplace_back(-1, 1, 1, -1);
    }
    if (!a && !b) {
      v.emplace_back(0, -1, -1, -1);
    }
  }
  vector<vector<vector<pair<int, int>>>> gens;
  gens.resize(4);
  for (size_t i = 0; i < 4; ++i) {
    gens[i].resize(4);
    for (size_t j = 0; j < 4; ++j) {
      generate(i, j, gens[i][j]);
    }
  }
  while (dp.back().size() != 1) {
    dp.emplace_back();
    auto& new_v = dp.back();
    auto& prev_v = dp[dp.size() - 2];
    for (size_t i = 0; i < prev_v.size(); i += 2) {
      const auto& st1 = prev_v[i];
      const auto& st2 = prev_v[i + 1];
      new_v.emplace_back(-1, -1, -1, -1);
      auto& st = new_v.back();
      for (size_t j1 = 0; j1 < 4; ++j1) {
        int v1 = get_value(st1, j1);
        if (v1 == -1) {
          continue;
        }
        for (size_t j2 = 0; j2 < 4; ++j2) {
          int v2 = get_value(st2, j2);
          if (v2 == -1) {
            continue;
          }
          for (auto [new_mask, count] : gens[j1][j2]) {
            auto cur_value = get_value(st, new_mask);
            if (cur_value == -1 || v1 + v2 + count > cur_value) {
              set_value(st, new_mask, v1 + v2 + count);
            }
          }
        }
      }
    }
  }
  int ans = 0;
  const auto& st = dp.back().front();
  for (size_t i = 0; i < 4; ++i) {
    int value = get_value(st, i);
    if (value == -1) {
      continue;
    }
    if (i > 0) {
      ++value;
    }
    ans = max(ans, value);
  }
  cout << ans << "\n";
  return 0;
}
