#include <stdio.h>
const int maxn = 60000;
const double esp = 1e-4, esp1 = 1e-8;
struct point {double x, y, p, q;}a[maxn];
struct pp {double x, y;} st[maxn * 20][2], g[maxn];
struct p {int l, r;}d[maxn * 4][2];
int i, n, x, y, m, num, task, next[maxn], e[maxn], first[maxn], dep[maxn], size[maxn], now = 0, s[maxn], rank[maxn], last = 0, top[maxn], f[maxn], height[maxn], nn[2];
void link(int u, int v)
{
    e[++num] = v, next[num] = first[u], first[u] = num;
    e[++num] = u, next[num] = first[v], first[v] = num;
}
void dfs(int xx, int fa, int depth)
{
    dep[xx] = depth, f[xx] = fa, size[xx] = 1;
    for (int p = first[xx]; p; p = next[p])
    if (e[p] != fa)
    {
        dfs(e[p], xx, depth + 1), size[xx] += size[e[p]];
        if (size[e[p]] > size[height[xx]]) height[xx] = e[p];
    }
}
void poufen(int xx, int fa)
{
    rank[s[++now] = xx] = now;
    if (!height[xx])
    {
    for (int i1 = now; i1 > last; --i1) top[s[i1]] = s[last + 1];
    last = now;
    }else
    {
    poufen(height[xx], xx);
    for (int p = first[xx]; p; p = next[p])
        if (e[p] != fa && e[p] != height[xx])
        poufen(e[p], xx);
    }
}
double cj(double x1, double y1, double x2, double y2)
{
    return x1 * y2 - x2 * y1;
}
void merge(int l1, int r1, int l2, int r2, int k)
{
    now = 0int mid;
    for (; l1 <= r1 || l2 <= r2; )
    {
    if (l1 > r1) mid = l2++; else
        if (l2 > r2) mid = l1++;
        else mid = st[l1][k].x < st[l2][k].x ? l1++ : l2++;
    while (now > 1 && cj(g[now].x - g[now - 1].x, g[now].y - g[now - 1].y, st[mid][k].x - g[now].x, st[mid][k].y - g[now].y) > 0) --now;
    g[++now] = st[mid][k];
    }
}
void updata(int xx)
{
    int i1, a1 = xx << 1, a2 = (xx << 1) + 1;
    if (d[a1][0].l == 0) {d[xx][0] = d[a2][0]; goto nextstep;}
    if (d[a2][0].l == 0) {d[xx][0] = d[a1][0]; goto nextstep;}
    merge(d[a1][0].l, d[a1][0].r, d[a2][0].l, d[a2][0].r, 0);
    d[xx][0].l = nn[0] + 1;
    for (i1 = 1; i1 <= now; ++i1) st[++nn[0]][0] = g[i1];
    d[xx][0].r = nn[0];

nextstep:
    if (d[a1][1].l == 0) {d[xx][1] = d[a2][1]; return ;}
    if (d[a2][1].l == 0) {d[xx][1] = d[a1][1]; return ;}
    merge(d[a1][1].l, d[a1][1].r, d[a2][1].l, d[a2][1].r, 1);
    d[xx][1].l = nn[1] + 1;
    for (i1 = 1; i1 <= now; ++i1) st[++nn[1]][1] = g[i1];
    d[xx][1].r = nn[1];
}
void origan()
{
    for (m = 1; m <= n + 1; m <<= 1);
    dfs(101); poufen(10);
    for (i = 1; i <= n; ++i)
    {
    d[i + m][0].l = d[i + m][0].r = d[i + m][1].l = d[i + m][1].r = ++num;
    st[num][0].x = a[s[i]].x, st[num][0].y = a[s[i]].y, st[num][1].x = a[s[i]].p, st[num][1].y = a[s[i]].q;
    }
    nn[0] = nn[1] = num;
    for (i = m - 1; i >= 1; --i) updata(i);
}
void swap(int &a1, int &a2)
{
    int mid = a1;
    a1 = a2, a2 = mid;
}
double max(double a1, double a2)
{
    return a1 >= a2 ? a1 : a2;
}
double rake(pp a1, pp a2)
{
    return (a2.y - a1.y) / (a2.x - a1.x);
}
double twodivide(int l, int r, int k, double ss)
{
    int mid;
    if (l > r) return -1e10;
    int ii = r;
    for (r--; l < r; )
    {
    mid = l + r + 1 >> 1;
    if (rake(st[mid][k], st[mid + 1][k])>= ss) l = mid; else r = mid - 1;
    }
    return max(st[l][k].y - ss * st[l][k].x, l               < ii ? st[l + 1][k].y - ss * st[l + 1][k].x : -1e90);
}
double ask(int k, int l, int r, double ss)
{
    double ans = -1e10;
    for (l += m - 1, r += m + 1; (l ^ r) != 1; l >>= 1, r >>= 1)
    {
    if ((l & 1) == 0) ans = max(ans, twodivide(d[l + 1][k].l, d[l + 1][k].r, k, ss));
    if ((r & 1) == 1) ans = max(ans, twodivide(d[r - 1][k].l, d[r - 1][k].r, k, ss));
    }
    return ans;
}
bool check(double ss, int x, int y)
{
    double ans[2];
    int tx, ty;
    ans[0] = ans[1] = -1e10;
    for (; top[x] != top[y]; x = f[tx])
    {
    tx = top[x], ty = top[y];
    if (dep[tx] < dep[ty]) swap(x, y), swap(tx, ty);
    ans[0] = max(ans[0], ask(0, rank[tx], rank[x], ss));
    ans[1] = max(ans[1], ask(1, rank[tx], rank[x], ss));
    }
    if (dep[x] < dep[y]) swap(x, y);
    ans[0] = max(ans[0], ask(0, rank[y], rank[x], ss));
    ans[1] = max(ans[1], ask(1, rank[y], rank[x], ss));
    return ans[0] + ans[1] + esp1 >= 0;
}
int main()
{
    freopen("saber.in""r", stdin);
    freopen("saber.out""w", stdout);
    scanf("%d", &n);
    for (i = 1; i <= n; ++i) scanf("%lf", &a[i].x);
    for (i = 1; i <= n; ++i) scanf("%lf", &a[i].y);
    for (i = 1; i <= n; ++i) scanf("%lf", &a[i].p);
    for (i = 1; i <= n; ++i) scanf("%lf", &a[i].q);
    for (i = 1; i < n; ++i)
    {
    scanf("%d%d", &x, &y);
    link(x, y);
    }
    num = 0, origan();
    for (scanf("%d", &task); task > 0; --task)
    {
    scanf("%d%d", &x, &y);
    double l1 = 0, r1 = 1e5, mid;
    for (; l1 + esp < r1; )
        if (check(mid = (l1 + r1) / 2.0, x, y)) l1 = mid;
        else r1 = mid;
    printf("%.4lf\n", l1);
    }
    return 0;
}