#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 = 0; int 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(1, 0, 1); poufen(1, 0);
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;
}
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 = 0; int 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(1, 0, 1); poufen(1, 0);
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;
}