#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int c[N];
int dep[N],fa[N][20];
vector<int>e[N];
//因为零食种类很少,就20种(遍历很快),可以用原始的数组存储,
int dp[N][25]; //存储从根节点出发到每个节点所能买到的零食种类
//dfs遍历打表并算出树前缀和
void dfs(int u,int father)
{
for(int i=1;i<=20;i++) dp[u][i]=dp[father][i];
dp[u][c[u]]++;
dep[u]=dep[father]+1;
fa[u][0]=father;
for(int i=1;i<=19;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
for(auto t:e[u]){
if(t!=father) dfs(t,u);
}
}
int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
for(int i=19;i>=0;i--){
if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
}
if(u==v) return v;
for(int i=19;i>=0;i--){
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
}
return fa[u][0];
}
int main()
{
int n,q;cin>>n>>q;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=0;i<n-1;i++){
int u,v;cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1,0);
while(q--)
{
int s,t;cin>>s>>t;
int l=lca(s,t);
int res[25],ans=0;
for(int i=1;i<=20;i++) res[i]=0;
for(int i=1;i<=20;i++) res[i]=dp[s][i]+dp[t][i]-2*dp[l][i];
res[c[l]]++;
for(int i=1;i<=20;i++) if(res[i]>0) ans++;
cout<<ans<<endl;
}
return 0;
}