#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int n;
void update(long long *tree, int pos, long long add) {
  while (pos <= n) tree[pos] += add, pos += pos & (-pos);
}
long long query(long long *tree, int pos) {
  long long ans = 0;
  while (pos) ans += tree[pos], pos -= pos & (-pos);
  return ans;
}
long long a[maxn], tree1[maxn], now1[maxn], tree2[maxn], now2[maxn];
double ans[maxn];
int l[maxn], r[maxn];
vector<int> gao[6][maxn];
int main() {
  while (~scanf("%d", &n)) {
    for (int i = 1; i <= n; i++) scanf("%I64d", &a[i]);
    l[1] = 1;
    for (int i = 2; i <= n; i++) {
      l[i] = i;
      while (l[i] != 1 && a[l[i] - 1] > a[i]) l[i] = l[l[i] - 1];
    }
    r[n] = n;
    for (int i = n - 1; i >= 1; i--) {
      r[i] = i;
      while (r[i] != n && a[r[i] + 1] >= a[i]) r[i] = r[r[i] + 1];
    }
    for (int i = 0; i < maxn; i++)
      for (int j = 0; j < 6; j++) gao[j][i].clear();
    for (int i = 1; i <= n; i++) {
      int a1 = r[i] + 1 - i;
      int a2 = i + 1 - l[i];
      if (a1 <= a2) {
        gao[0][a1].push_back(i);
        gao[1][a2 + 1].push_back(i);
        gao[2][r[i] - l[i] + 3].push_back(i);
      } else {
        gao[3][a2].push_back(i);
        gao[4][a1 + 1].push_back(i);
        gao[5][r[i] - l[i] + 3].push_back(i);
      }
    }
    memset(tree1, 0, sizeof(tree1));
    memset(tree2, 0, sizeof(tree2));
    for (int i = 1; i <= n; i++) {
      now1[i] = 1;
      update(tree1, i, a[i]);
      now2[i] = 0;
    }
    for (int L = 1; L <= n; L++) {
      for (int i = 0; i < gao[0][L].size(); i++) {
        int pos = gao[0][L][i];
        update(tree1, pos, -a[pos]);
        update(tree2, pos, (r[pos] - pos + 1LL) * a[pos]);
      }
      for (int i = 0; i < gao[1][L].size(); i++) {
        int pos = gao[1][L][i];
        update(tree2, pos, -(r[pos] - pos + 1LL) * a[pos]);
        update(tree2, pos, (r[pos] - l[pos] + 2LL) * a[pos]);
        update(tree1, pos, -a[pos]);
      }
      for (int i = 0; i < gao[2][L].size(); i++) {
        int pos = gao[2][L][i];
        update(tree2, pos, -(r[pos] - l[pos] + 2LL) * a[pos]);
        update(tree1, pos, a[pos]);
      }
      for (int i = 0; i < gao[3][L].size(); i++) {
        int pos = gao[3][L][i];
        update(tree1, pos, -a[pos]);
        update(tree2, pos, (pos - l[pos] + 1LL) * a[pos]);
      }
      for (int i = 0; i < gao[4][L].size(); i++) {
        int pos = gao[4][L][i];
        update(tree2, pos, -(pos - l[pos] + 1LL) * a[pos]);
        update(tree2, pos, (r[pos] - l[pos] + 2LL) * a[pos]);
        update(tree1, pos, -a[pos]);
      }
      for (int i = 0; i < gao[5][L].size(); i++) {
        int pos = gao[5][L][i];
        update(tree2, pos, -(r[pos] - l[pos] + 2LL) * a[pos]);
        update(tree1, pos, a[pos]);
      }
      long long temp = query(tree1, n) * L + query(tree2, n);
      ans[L] = 1.0 * temp / (n - L + 1);
    }
    int m;
    scanf("%d", &m);
    while (m--) {
      int k;
      scanf("%d", &k);
      printf("%.10f\n", ans[k]);
    }
  }
}
