#include <bits/stdc++.h>   using namespace std;   int par[100005], val[100005];   int lefm[100005], rim[100005];   int root = 0;   vector<vector<int> > adjl;   int n;   void pre(int node) {     if (adjl[node].size() == 0) {       lefm[node] = val[node];       rim[node] = val[node];       return;     }     for (int i = (0); i < (adjl[node].size()); ++i) {       pre(adjl[node][i]);       if (val[adjl[node][i]] < val[node])         lefm[node] = lefm[adjl[node][i]];       else         rim[node] = rim[adjl[node][i]];     }   }   double res[100005];   pair<int, int> qu[100005];   void query(int node, int left, int right, long long cost, int dep) {     if (adjl[node].size() == 0) {       for (int i = (left); i < (right); ++i) res[qu[i].second] += cost * 1. / dep;       return;     }     int ind = lower_bound(qu + left, qu + right, make_pair(val[node], 0)) - qu;     if (ind > left && adjl[node].size() == 2)       query(adjl[node][0], left, ind, cost + lefm[adjl[node][1]], dep + 1);     if (ind < right && adjl[node].size() == 2)       query(adjl[node][1], ind, right, cost + rim[adjl[node][0]], dep + 1);   }   int main() {     int x, y, k;     scanf( %d , &n);     adjl.clear();     adjl.resize(n);     for (int i = (0); i < (n); ++i) {       scanf( %d %d , &x, &y);       x--;       val[i] = y;       par[i] = x;       if (x >= 0) adjl[x].push_back(i);       if (x < 0) root = i;     }     for (int i = (0); i < (adjl.size()); ++i) {       if (adjl[i].size() == 2)         if (val[adjl[i][0]] > val[adjl[i][1]]) swap(adjl[i][0], adjl[i][1]);       if (adjl[i].size() == 1) throw 2;     }     pre(root);     scanf( %d , &k);     for (int i = (0); i < (k); ++i) scanf( %d , &qu[i].first), qu[i].second = i;     sort(qu, qu + k);     query(root, 0, k, 0, 0);     for (int i = (0); i < (k); ++i) printf( %.12lf n , res[i]);     return 0;   }   