#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> A, B, pre, post, guys, d;
vector<vector<int>> adjlist, p2;
int cnt = 0, sqrtN;
void dfs(int n, int p) {
p2[0][n] = p;
if (p != -1) d[n] = d[p] + 1;
pre[n] = cnt++;
guys.push_back(n);
for (int i : adjlist[n]) if (i != p) dfs(i, n);
post[n] = cnt++;
guys.push_back(n);
}
int lca(int a, int b) {
if (d[a] < d[b]) swap(a, b);
for (int i = 0; i < 20; i++) if ((d[a] - d[b]) & (1LL << i)) a = p2[i][a];
if (a == b) return a;
for (int i = 19; i >= 0; i--) if (p2[i][a] != p2[i][b]) a = p2[i][a], b = p2[i][b];
return p2[0][a];
}
bool comp(pair<pair<int, int>, int> a, pair<pair<int, int>, int> b) {
if (a.first.first / sqrtN == b.first.first / sqrtN) return a.first.second < b.first.second;
return a.first.first < b.first.first;
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, M, Q, a, b; cin >> N;
sqrtN = sqrt(N);
adjlist.resize(N, vector<int>());
pre.resize(N, -1);
post.resize(N, -1);
d.resize(N, 0);
p2.resize(20, vector<int>(N, -1));
vector<pair<pair<int, int>, int>> quers;
for (int i = 0; i < N; i++) {
cin >> a;
A.push_back(a);
}
for (int i = 0; i < N - 1; i++) {
cin >> a >> b; a--, b--;
adjlist[a].push_back(b);
adjlist[b].push_back(a);
}
dfs(0, -1);
for (int i = 1; i < 20; i++) {
for (int j = 0; j < N; j++) {
if (p2[i - 1][j] == -1) continue;
p2[i][j] = p2[i - 1][p2[i - 1][j]];
}
}
cin >> M;
for (int i = 0; i < M; i++) {
cin >> a >> b; a--, b--;
if (d[a] > d[b]) swap(a, b);
int clca = lca(a, b);
if (a == clca) quers.push_back({ { pre[a], pre[b] + 1 }, -1 });
else {
if (pre[a] > pre[b]) swap(a, b);
quers.push_back({ { post[a], pre[b] + 1 }, clca });
}
}
sort(quers.begin(), quers.end(), comp);
cin >> Q;
for (int i = 0; i < Q; i++) {
cin >> a;
B.push_back(a);
}
pair<int, int> crntr = { 0, 0 };
bitset<100005> visited = 0;
vector<int> freq(N + 1, 0), anss(Q, 0);
for (int i = 0; i < M; i++) {
while (crntr.second < quers[i].first.second) {
int j = guys[crntr.second];
if (visited[j]) freq[A[j]]--;
for (int k = 0; k < Q; k++) {
if (N < B[k] - A[j] || B[k] - A[j] < 0) continue;
if (visited[j]) anss[k] -= (M - i) * freq[B[k] - A[j]];
else anss[k] += (M - i) * freq[B[k] - A[j]];
}
visited[j] = !visited[j];
if (visited[j]) freq[A[j]]++;
crntr.second++;
}
while (crntr.first > quers[i].first.first) {
crntr.first--;
int j = guys[crntr.first];
if (visited[j]) freq[A[j]]--;
for (int k = 0; k < Q; k++) {
if (N < B[k] - A[j] || B[k] - A[j] < 0) continue;
if (visited[j]) anss[k] -= (M - i) * freq[B[k] - A[j]];
else anss[k] += (M - i) * freq[B[k] - A[j]];
}
visited[j] = !visited[j];
if (visited[j]) freq[A[j]]++;
}
while (crntr.second > quers[i].first.second) {
crntr.second--;
int j = guys[crntr.second];
if (visited[j]) freq[A[j]]--;
for (int k = 0; k < Q; k++) {
if (N < B[k] - A[j] || B[k] - A[j] < 0) continue;
if (visited[j]) anss[k] -= (M - i) * freq[B[k] - A[j]];
else anss[k] += (M - i) * freq[B[k] - A[j]];
}
visited[j] = !visited[j];
if (visited[j]) freq[A[j]]++;
}
while (crntr.first < quers[i].first.first) {
int j = guys[crntr.first];
if (visited[j]) freq[A[j]]--;
for (int k = 0; k < Q; k++) {
if (N < B[k] - A[j] || B[k] - A[j] < 0) continue;
if (visited[j]) anss[k] -= (M - i) * freq[B[k] - A[j]];
else anss[k] += (M - i) * freq[B[k] - A[j]];
}
visited[j] = !visited[j];
if (visited[j]) freq[A[j]]++;
crntr.first++;
}
if (quers[i].second == -1) continue;
for (int j = 0; j < Q; j++) {
if (N < B[j] - A[quers[i].second] || B[j] - A[quers[i].second] < 0) continue;
anss[j] += (M - i) * freq[B[j] - A[quers[i].second]];
}
}
for (int i : anss) cout << i << '\n';
}