#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1 << 20;
vector<int> tree[1 << 21 | 5];
long long Inv[1 << 21 | 5], Inv2[1 << 21 | 5];
long long inv[25], inv2[25];
int arr[MAXN + 5];
int n, qs;
int lg;
void merge(int node, int left, int right, int dep) {
  Inv[node] = Inv[left] + Inv[right];
  int j = 0;
  for (int i = 0; i < tree[left].size(); i++) {
    while (j < tree[right].size() && tree[right][j] < tree[left][i]) {
      tree[node].push_back(tree[right][j]);
      j++;
    }
    tree[node].push_back(tree[left][i]);
    Inv[node] += j;
  }
  while (j < tree[right].size()) tree[node].push_back(tree[right][j++]);
  Inv2[node] = Inv2[left] + Inv2[right];
  j = 0;
  for (int i = 0; i < tree[right].size(); i++) {
    while (j < tree[left].size() && tree[left][j] < tree[right][i]) j++;
    Inv2[node] += j;
  }
  inv[dep] += Inv[node];
  inv2[dep] += Inv2[node];
  return;
}
void count(int node, int s, int e, int dep) {
  if (s == e) {
    tree[node].push_back(arr[s]);
    Inv[node] = 0;
    return;
  }
  int mid = (s + e) >> 1;
  count(node << 1, s, mid, dep + 1);
  count(node << 1 | 1, mid + 1, e, dep + 1);
  merge(node, node << 1, node << 1 | 1, dep);
  return;
}
int main() {
  int c, c2;
  scanf("%d", &n);
  lg = n;
  n = 1 << n;
  for (c = 0; c < n; c++) scanf("%d", &arr[c]);
  count(1, 0, n - 1, 0);
  long long ret = inv[0];
  scanf("%d", &qs);
  for (c = 0; c < qs; c++) {
    int dep;
    scanf("%d", &dep);
    dep = lg - dep;
    swap(inv[dep], inv2[dep]);
    long long diff = inv[dep] - inv2[dep];
    for (int d = 0; d <= lg; d++) {
      if (d < dep) {
        inv[d] += diff;
        inv2[d] -= diff;
      } else if (d > dep)
        swap(inv[d], inv2[d]);
    }
    ret += diff;
    printf("%I64d\n", ret);
  }
  return 0;
}
