#include <bits/stdc++.h>
const int Mod = (int)1e9 + 7;
const int MX = 1073741822;
const long long MXLL = 4611686018427387903;
const int Sz = (1 << 20);
using namespace std;
inline void Read_rap() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
}
int n;
long long t[22][2];
bool inv[Sz];
long long ans;
vector<int> a[4 * Sz];
inline void merge(vector<int> &c, vector<int> &a, vector<int> &b, int lvl) {
  c.resize((int)(a.size()) + (int)(b.size()));
  for (int i = 0, j = 0; i < (int)(a.size()) || j < (int)(b.size());) {
    if (i == (int)(a.size())) {
      c[i + j] = b[j];
      j++;
    } else if (j == (int)(b.size())) {
      c[i + j] = a[i];
      i++;
    } else if (a[i] <= b[j]) {
      c[i + j] = a[i];
      i++;
    } else {
      c[i + j] = b[j];
      j++;
      t[lvl][0] += (int)(a.size()) - i;
    }
  }
  for (int i = 0, j = 0; i < (int)(a.size()) || j < (int)(b.size());) {
    if (i == (int)(a.size())) {
      c[i + j] = b[j];
      j++;
    } else if (j == (int)(b.size())) {
      c[i + j] = a[i];
      i++;
    } else if (b[j] <= a[i]) {
      c[i + j] = b[j];
      j++;
    } else {
      c[i + j] = a[i];
      i++;
      t[lvl][1] += (int)(b.size()) - j;
    }
  }
}
void merge_sort(int v, int l, int r, int lvl) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  merge_sort(2 * v, l, mid, lvl + 1);
  merge_sort(2 * v + 1, mid + 1, r, lvl + 1);
  merge(a[v], a[2 * v], a[2 * v + 1], lvl);
}
inline void update(int lvl) {
  for (int i = lvl; i <= n; i++) {
    ans += t[i][inv[i] ^ 1] - t[i][inv[i]];
    inv[i] ^= 1;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = (1 << n); i < (1 << n + 1); i++) {
    int x;
    scanf("%d", &x);
    a[i].push_back(x);
  }
  merge_sort(1, 1, (1 << n), 1);
  for (int l = 1; l <= n; l++) {
    ans += t[l][inv[l]];
  }
  int q;
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    int len;
    scanf("%d", &len);
    update(n - len + 1);
    printf("%I64d\n", ans);
  }
  return 0;
}
