#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << ' ' << *it << " = " << a;
  err(++it, args...);
}
inline void op() { cout << '\n'; }
template <typename T, typename... Types>
inline void op(T var1, Types... var2) {
  cout << var1 << ' ';
  op(var2...);
}
inline void ip() {}
template <typename T, typename... Types>
inline void ip(T& var1, Types&... var2) {
  cin >> var1;
  ip(var2...);
}
template <typename T, typename U>
inline void min_self(T& x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void max_self(T& x, U y) {
  if (x < y) x = y;
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> pair) {
  return out << "(" << pair.first << ", " << pair.second << ")";
}
template <class T>
ostream& operator<<(ostream& out, vector<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ' ';
  return out << ")";
}
template <class T>
ostream& operator<<(ostream& out, set<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
template <class L, class R>
ostream& operator<<(ostream& out, map<L, R> vec) {
  out << "(";
  for (auto& v : vec) out << "[" << v.first << ", " << v.second << "]";
  return out << ")";
}
template <class A, class B>
istream& operator>>(istream& in, pair<A, B>& a) {
  return in >> a.first >> a.second;
}
template <class A>
istream& operator>>(istream& in, vector<A>& a) {
  for (A& i : a) in >> i;
  return in;
}
template <class Container>
void split(const std::string& str, Container& cont, char delim = ',') {
  stringstream ss(str);
  string token;
  while (std::getline(ss, token, delim)) {
    cont.push_back(token);
  }
}
int px[4] = {-1, 0, 1, 0};
int py[4] = {0, -1, 0, 1};
struct edge {
  int u, v, wt;
  edge(int a = 0, int b = 0, int c = 0) : u(a), v(b), wt(c) {}
  bool operator<(edge const& other) { return wt < other.wt; }
  friend ostream& operator<<(ostream& out, const edge& x) {
    return out << "(" << x.u << ", " << x.v << ", " << x.wt << ")";
  }
};
int N, q, n;
const int maxn = (1 << 20) + 5;
int a[maxn], bucket[maxn];
long long inv[25], invbar[25], res;
void solve(int level, int lx, int rx) {
  if (rx - lx == 1) return;
  int m = (lx + rx) / 2;
  solve(level - 1, lx, m);
  solve(level - 1, m, rx);
  int i1 = lx, i2 = m;
  while (i1 < m) {
    while (i2 < rx && a[i2] < a[i1]) i2++;
    inv[level] += i2 - m;
    i1++;
  }
  i1 = lx;
  i2 = m;
  while (i2 < rx) {
    while (i1 < m && a[i2] > a[i1]) i1++;
    invbar[level] += i1 - lx;
    i2++;
  }
  merge(a + lx, a + m, a + m, a + rx, bucket + lx);
  for (int i = lx; i <= rx - 1; i++) a[i] = bucket[i];
  return;
}
void abcd() {
  int x;
  ip(N);
  n = (1 << N);
  for (int i = 0; i <= n - 1; i++) ip(a[i]);
  solve(N, 0, n);
  ip(q);
  while (q--) {
    ip(x);
    res = 0;
    for (int i = 0; i <= x; i++) swap(inv[i], invbar[i]);
    for (int i = 0; i <= N; i++) res += inv[i];
    op(res);
  }
  return;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int t = 1;
  while (t--) {
    abcd();
  }
  return 0;
}
