#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int inf = 1e9 / 2;
vector<int> a;
int n, q, m;
struct Bucket {
  long long inversions;
  long long exclude;
  int depth;
  Bucket() { inversions = exclude = depth = 0; }
  long long flip() {
    long long all = 1 << (n - depth);
    long long buckets = (1 << n) / all;
    long long new_val = all * buckets * (all - 1) / 2 - inversions - exclude;
    long long res = new_val - inversions;
    inversions = new_val;
    return res;
  }
};
long long merge(vector<int>& v, int s, int mid, int e) {
  vector<int> aux(e - s + 1);
  int p1 = s, p2 = mid + 1, cntr = 0;
  long long invs = 0;
  while (p1 <= mid && p2 <= e) {
    if (v[p1] <= v[p2])
      aux[cntr++] = v[p1++];
    else {
      aux[cntr++] = v[p2++];
      invs += mid - p1 + 1;
    }
  }
  while (p1 <= mid) {
    aux[cntr++] = v[p1++];
  }
  while (p2 <= e) {
    aux[cntr++] = v[p2++];
  }
  for (int i = 0; i < aux.size(); i++) v[s++] = aux[i];
  return invs;
}
Bucket buck[25];
long long _count_inversions(vector<int>& v, int s, int e, int depth = 0) {
  buck[depth].depth = depth;
  if (s == e) return 0;
  int mid = (s + e) / 2;
  long long res = 0;
  res += _count_inversions(v, s, mid, depth + 1);
  res += _count_inversions(v, mid + 1, e, depth + 1);
  res += merge(v, s, mid, e);
  map<int, int> make_pair;
  for (int i = s; i <= e; i++) make_pair[v[i]]++;
  for (map<int, int>::iterator it = make_pair.begin(); it != make_pair.end();
       it++) {
    int cnta = it->second;
    if (cnta > 1) buck[depth].exclude += cnta * 1ll * (cnta - 1) / 2;
  }
  buck[depth].inversions += res;
  return res;
}
long long count_inversions(vector<int> v) {
  return _count_inversions(v, 0, v.size() - 1);
}
int main() {
  ios_base::sync_with_stdio(false);
  scanf("%d", &n);
  a.resize(1 << n);
  for (int i = 0; i < 1 << n; i++) scanf("%d", &a[i]);
  long long inversions = count_inversions(a);
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    int q;
    scanf("%d", &q);
    q = n - q;
    long long difference = buck[q].flip();
    inversions += difference;
    for (int j = q + 1; j < n; j++) buck[j].flip();
    for (int j = q - 1; j >= 0; j--) buck[j].inversions += difference;
    printf("%lld\n", inversions);
  }
  return 0;
}
