#include <bits/stdc++.h>
using namespace std;
const long long MAXSZ = (1 << 20) + 1;
const long long MAXN = 20 + 2;
long long n;
long long arr[MAXSZ];
void merge(vector<long long> &ans, vector<long long> a, vector<long long> b,
           long long &cnt_inv1, long long &cnt_inv2) {
  long long idx1 = 0, idx2 = 0;
  size_t sz1 = a.size(), sz2 = b.size();
  while (idx1 < sz1 && idx2 < sz2) {
    if (a[idx1] <= b[idx2]) {
      ans.push_back(a[idx1]);
      idx1++;
    } else {
      ans.push_back(b[idx2]);
      idx2++;
    }
  }
  while (idx1 < sz1) {
    ans.push_back(a[idx1]);
    idx1++;
  }
  while (idx2 < sz2) {
    ans.push_back(b[idx2]);
    idx2++;
  }
  idx2 = 0;
  for (long long i : a) {
    while (b[idx2] < i && idx2 < sz2) idx2++;
    cnt_inv1 += idx2;
  }
  idx1 = 0;
  for (long long i : b) {
    while (a[idx1] < i && idx1 < sz1) idx1++;
    cnt_inv2 += idx1;
  }
}
long long inv1[MAXN];
long long inv2[MAXN];
vector<long long> tr[MAXSZ * 4];
void build(long long v, long long l, long long r, long long level) {
  if (l == r) {
    tr[v].push_back(arr[l]);
    return;
  }
  long long mid = (l + r) >> 1;
  build(v << 1, l, mid, level + 1);
  build((v << 1) + 1, mid + 1, r, level + 1);
  long long cnt_inv1 = 0, cnt_inv2 = 0;
  merge(tr[v], tr[v << 1], tr[(v << 1) + 1], cnt_inv1, cnt_inv2);
  inv1[level] += cnt_inv1;
  inv2[level] += cnt_inv2;
}
long long actual[MAXN];
long long q;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n;
  for (int i = 1; i <= (1 << n); i++) cin >> arr[i];
  build(1, 1, (1 << n), 1);
  cin >> q;
  for (int i = 1; i <= n; i++) actual[i] = inv1[i];
  for (int i = 1; i <= q; i++) {
    long long height;
    cin >> height;
    for (int j = n - height + 1; j <= n; j++) {
      if (actual[j] == inv1[j])
        actual[j] = inv2[j];
      else
        actual[j] = inv1[j];
    }
    long long ans = 0;
    for (int j = 1; j <= n; j++) ans += actual[j];
    cout << ans << '\n';
  }
}
