#include using namespace std; const int MaxN = 5e5 + 10; const int MOD = 1e9 + 7; const int INF = 1e9; int n, m, q, a[MaxN]; vector < int > graph[MaxN]; vector < pair < int, int > > queries[MaxN]; int ans[MaxN], sz[MaxN], bs[MaxN]; int dep[MaxN], foo[MaxN], dead[MaxN]; void dfs(int v, int p) { sz[v] = 1; bs[v] = -1; for (int i = 0; i < (int)graph[v].size(); ++i) { int to = graph[v][i]; if (dead[to] == 1 || to == p) { continue; } dfs(to, v); sz[v] += sz[to]; if (bs[v] == -1 || sz[to] > sz[bs[v]]) { bs[v] = to; } } } void go(int v, int p, vector < pair < int, int > > &colors) { colors.push_back(make_pair(a[v], v)); for (int i = 0; i < (int)graph[v].size(); ++i) { int to = graph[v][i]; if (dead[to] == 1 || to == p) { continue; } dep[to] = dep[v] + 1; go(to, v, colors); } } void solve(int v) { dfs(v, -1); int tot = sz[v]; while (bs[v] != -1 && sz[bs[v]] >= tot / 2) { v = bs[v]; } dead[v] = 1; dep[v] = 0; vector < pair < int, int > > colors; colors.reserve(tot); for (int i = 0; i < (int)graph[v].size(); ++i) { int to = graph[v][i]; if (dead[to] == 1) { continue; } dep[to] = 1; go(to, v, colors); } colors.push_back(make_pair(a[v], v)); for (int i = 0; i < (int)colors.size(); ++i) { foo[colors[i].first] = min(foo[colors[i].first], dep[colors[i].second]); } for (int i = 0; i < (int)colors.size(); ++i) { int v = colors[i].second; for (int j = 0; j < (int)queries[v].size(); ++j) { int where = queries[v][j].second, color = queries[v][j].first; // cout << ' ' << v << ' ' << where << ' ' << color << ' ' << foo[color] << ' ' << a[v] << '\n'; ans[where] = min(ans[where], foo[color] + dep[v]); } } for (int i = 0; i < (int)colors.size(); ++i) { foo[colors[i].first] = INF; } for (int i = 0; i < (int)graph[v].size(); ++i) { int to = graph[v][i]; if (dead[to] == 1) { continue; } solve(to); } } int main() { // freopen("input.txt", "r", stdin); scanf("%d%d", &n, &m); srand(time(NULL)); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); } for (int i = 1; i <= m; ++i) { foo[i] = INF; } for (int i = 0; i < n - 1; ++i) { int x, y; scanf("%d%d", &x, &y); graph[x].push_back(y); graph[y].push_back(x); } scanf("%d", &q); for (int qi = 1; qi <= q; ++qi) { int color, v; scanf("%d%d", &v, &color); ans[qi] = INF; queries[v].push_back(make_pair(color, qi)); } solve(1); for (int qi = 1; qi <= q; ++qi) { printf("%d\n", ans[qi]); } return 0; }