#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 20) + 1000;
const int INF = 1000000000;
const int Mod = 1000000007;
void update(int tree[], int k, int v) {
  while (k < N) {
    tree[k] += v;
    k += k & (-k);
  }
}
int get(int tree[], int k) {
  int ret = 0;
  while (k) {
    ret += tree[k];
    k -= k & (-k);
  }
  return ret;
}
int a[N], n, tot, r[N], mp[N], tree[N];
long long dp[30], sum[30], f[30];
bool cmpr(int i, int j) { return a[i] < a[j]; }
int Hash() {
  for (int i = 0; i < tot; i++) r[i] = i;
  sort(r, r + tot, cmpr);
  int K = 1;
  mp[1] = a[r[0]];
  for (int i = 0; i < tot; i++) {
    if (mp[K] != a[r[i]]) mp[++K] = a[r[i]];
    a[r[i]] = K;
  }
  return K;
}
int main() {
  scanf("%d", &n);
  tot = 1 << n;
  for (int i = 0; i < tot; i++) scanf("%d", &a[i]);
  int fuck = Hash();
  for (int i = 1; i <= n; i++) {
    dp[i] += dp[i - 1];
    sum[i] += sum[i - 1];
    int len = 1 << (i - 1);
    for (int j = tot / len - 2; j >= 0; j -= 2) {
      for (int k = 0; k < len; k++) update(tree, a[(j + 1) * len + k], 1);
      for (int k = 0; k < len; k++) {
        int tmp = get(tree, a[j * len + k] - 1);
        sum[i] += tmp;
        dp[i] += tmp;
      }
      for (int k = 0; k < len; k++) update(tree, a[(j + 1) * len + k], -1);
      for (int k = 0; k < len; k++) update(tree, a[j * len + k], 1);
      for (int k = 0; k < len; k++) {
        sum[i] += get(tree, a[(j + 1) * len + k] - 1);
      }
      for (int k = 0; k < len; k++) update(tree, a[j * len + k], -1);
    }
  }
  int m;
  scanf("%d", &m);
  while (m--) {
    int x;
    scanf("%d", &x);
    long long t1 = dp[x], t2 = sum[x] - dp[x];
    f[0] = 0;
    for (int i = 1; i < x; i++) {
      f[i] = dp[i];
      dp[i] = sum[i] - dp[i];
    }
    for (int i = x; i <= n; i++) {
      dp[i] = dp[i] - t1 + t2;
    }
    printf("%I64d\n", dp[n]);
  }
  return 0;
}
