#include<bits/stdc++.h>
using namespace std;
#define N 100010
int w[N];
int sn,n,m,u,v,tst;
int cnt[100000]={0};
vector<int> g[N];
vector<pair<int, pair<int,int > > > q;
int a[N];
int st[N];
int en[N];
int lvl[N];
int p[N];
int ansq[N]={0};
bool isvisited[N];
struct compare{
bool operator()(const pair<int, pair<int,int > > &a1, const pair<int, pair<int,int > > &a2)
{
    if(((a1.second).first)/sn!=((a2.second).first)/sn)
        return ((a1.second).first)/sn<((a2.second).first)/sn;
    else
        return ((a1.second).second)<((a2.second).second);
}
};
void dfs(int i,int l)
{
    if(!isvisited[i])
    {
        if(l==0)
        {
         p[i]=0;
        }
        isvisited[i]=1;
        lvl[i]=l;
        st[i]=tst;
        a[tst]=i;
        tst++;
        vector<int>::iterator it;
        for(it=g[i].begin();it!=g[i].end();it++)
        {
            dfs(*it,l+1);
            p[*it]=i;
        }
        en[i]=tst;
        a[tst]=i;
        tst++;
    }
}
int par(int x,int z)
{
    while(lvl[z]!=lvl[x])
    {
        z=p[z];
    }
    if(z==x)
        return 1;
    while(p[x]!=p[z]&&p[x]!=0&&p[z]!=0)
    {
        x=p[x];
        z=p[z];
    }
    if(p[x]==0)
        return x;
    else
        return p[x];
}
inline void check(int x, int& res){
	if ( (isvisited[x]) and (--cnt[w[x]] == 0) ) res--;
	else if ( (!isvisited[x]) and (cnt[w[x]]++ == 0) ) res++;
	isvisited[x] ^= 1;
}
int main()
{
    memset(isvisited,0,sizeof(isvisited));
    for(int i=0;i<N;i++){
        ansq[i]=0;
        cnt[i]=0;
    }
    scanf("%d %d",&n,&m);
    for(int i=1;i<n+1;i++)
        scanf("%d",&w[i]);
    for(int i=0;i<n-1;i++)
    {
        scanf("%d %d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    tst=0,a[tst]=0;
    //cout<<"dfs start"<<endl;
    for(int i=1;i<n;i++){
        dfs(i,0);
    }
    //cout<<" dfs end"<<endl;
    //for(int i=0;i<tst;i++)
      //  cout<<a[i]<<" ";
    //cout<<endl;
    //cout<<tst<<"\n";
    sn=sqrt(tst);
    //cout<<"query insertion time"<<endl;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&u,&v);
        if(lvl[u]>lvl[v])
        {
            int temp=u;
            u=v;
            v=temp;
        }
        //cout<<"query insertion processing"<<endl;
        int k=par(u,v);
        if(k==u)
        {
            q.push_back(make_pair(i,make_pair(st[u],st[v])));
        }
        else
        {
            q.push_back(make_pair(i,make_pair(en[u],st[v])));
            q.push_back(make_pair(i,make_pair(st[k],st[k])));
        }
      // cout<<"a query is inserted"<<endl;
    }
    //cout<<"all query inserted an sorting start"<<endl;
    sort(q.begin(),q.end(),compare());
    //cout<<"query sorted"<<endl;
    vector<pair<int, pair<int,int > > >::iterator it1;
    int curl=0,cur=0,ans=0,val;
    memset(isvisited,0,sizeof(isvisited));
    for(it1=q.begin();it1!=q.end();it1++)
    {
        //cout<<"a query is given consideration"<<endl;
        u=(it1->second).first;
        v=(it1->second).second;
        int ind=it1->first;
        //cout<<"a query curl and u is checked for <"<<endl;
        while(curl<u)
        {
            val=a[curl];
            check(val,ans);
            curl++;
        }
        //cout<<"a query curl and u is checked for >"<<endl;
        while(curl>u)
        {
            curl--;
            val=a[curl];
            check(val,ans);        }
        //cout<<"a query cur and v is checked for >"<<endl;
        while(cur>v)
        {
            val=a[cur];
            check(val,ans);
            curl--;
        }
        while(cur<v)
        {
            cur++;
            val=a[cur];
            check(val,ans);
        }
        ansq[ind]+=ans;
    }
    for(int i=1;i<=m;i++)
        printf("%d\n",ansq[i]);
    return 0;
}
