/// MO on tree by muoii
/// MO algo: (block(l1)!=block(l2))?l1<l2:r1<r2
/// www.spoj.com/problems/COT2/
#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 40007
#define maxc 0
#define maxlog 17
#define oo 1000000007
#define mid ((l+r)>>1)
#define meset(a,x) memset(a,x,sizeof(a))
#define loop(x) for(int LoOpEr=1;LoOpEr<=x;LoOpEr++)
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int n,m;
int a[maxn];
int c[maxn];
vector<int> adj[maxn];
#define add_edge(u,v) adj[u].push_back(v),adj[v].push_back(u)
int numbering;
int tour[2*maxn];
int beg[maxn],fin[maxn];
int par[maxn][(int)log2(2*maxn)];
#define parent(u) par[u][0]
#define ances(u,i) par[u][i]
int h[maxn];
#define depth(u) h[u]
/// DFS:
void dfs(const int &u,const int &parent,const int &depth)
{
tour[beg[u]=++numbering]=u;
parent(u)=parent;
depth(u)=depth;
///dplca:
for(int i=1;1<<i<n;i++) ances(u,i)=ances(ances(u,i-1),i-1);
for(const int &v: adj[u])
if(!depth(v))
dfs(v,u,depth+1);
tour[fin[u]=++numbering]=u;
}
/// LCA:
int lca(int x,int y)
{
if(depth(x)<depth(y)) swap(x,y);
while(depth(x)>depth(y)) x=ances(x,(int)log2(depth(x)-depth(y)));
int lg=log2(depth(x));
while(x!=y)
{
while(lg>0 && ances(x,lg)==ances(y,lg)) --lg;
x=ances(x,lg),y=ances(y,lg);
}
return x;
}
/// MO algo:
#define sqrt2n ((int)(sqrt(2*n)))
#define block(i) (i/sqrt2n)
struct query{
int id,left,right;
int special;
query(const int &x,const int &y,const int &i)
{
id=i;
int u=x,v=y;
if(beg[u]>beg[v]) swap(u,v);
int lcanc=lca(u,v);
special=(lcanc!=u)?lcanc:0;
left=!special?beg[u]:fin[u];
right=beg[v];
}
bool operator < (const query &q) const{
return (block(left)!=block(q.left))?left<q.left:right<q.right;
}
};
int CNTER=0;
#define onpath(ver,left,right) (!((left<=beg[ver] && fin[ver]<=right) || (fin[ver]<left && beg[ver]>right)))
void add(const int &i,const int &l,const int &r)
{
if(onpath(tour[i],l,r)) CNTER+=!c[a[tour[i]]],c[a[tour[i]]]++;
else c[a[tour[i]]]--,CNTER-=!c[a[tour[i]]];
}
void del(const int &i,const int &l,const int &r)
{
if(onpath(tour[i],l,r)) c[a[tour[i]]]--,CNTER-=!c[a[tour[i]]];
else CNTER+=!c[a[tour[i]]],c[a[tour[i]]]++;
}
///MAIN:
int main()
{
#ifdef dmdd
freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
#endif // dmdd
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
///input:
cin>>n>>m;
vector<int> d;
for(int i=1;i<=n;i++) cin>>a[i],d.push_back(a[i]);
sort(d.begin(),d.end());
for(int i=1;i<=n;i++) a[i]=lower_bound(d.begin(),d.end(),a[i])-d.begin()+1;
int u,v;
loop(n-1) cin>>u>>v,add_edge(u,v);
dfs(1,0,1);
vector<query> Q;
vector<int> ans(m);
for(int i=0;i<m;i++) cin>>u>>v,Q.push_back(query(u,v,i));
sort(Q.begin(),Q.end());
int l=1,r=0,L=1,R=0;
for(const auto &q: Q)
{
L=q.left,R=q.right;
while (l>L) --l,add(l,l,r);
while (r<R) ++r,add(r,l,r);
while (l<L) del(l,l,r),l++;
while (r>R) del(r,l,r),r--;
ans[q.id]=CNTER + (q.special && c[a[q.special]]==0);
}
for(const int &rep: ans) cout<<rep<<"\n";
return 0;
}
Ly8vIE1PIG9uIHRyZWUgYnkgbXVvaWkKLy8vIE1PIGFsZ286IChibG9jayhsMSkhPWJsb2NrKGwyKSk/bDE8bDI6cjE8cjIKCi8vLyB3d3cuc3Bvai5jb20vcHJvYmxlbXMvQ09UMi8KCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIHRhZyAic3BvaiIKI2RlZmluZSBtYXhuIDQwMDA3CiNkZWZpbmUgbWF4YyAwCiNkZWZpbmUgbWF4bG9nIDE3CiNkZWZpbmUgb28gMTAwMDAwMDAwNwojZGVmaW5lIG1pZCAoKGwrcik+PjEpCiNkZWZpbmUgbWVzZXQoYSx4KSBtZW1zZXQoYSx4LHNpemVvZihhKSkKI2RlZmluZSBsb29wKHgpIGZvcihpbnQgTG9PcEVyPTE7TG9PcEVyPD14O0xvT3BFcisrKQovLy8+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+CmludCBuLG07CmludCBhW21heG5dOwppbnQgY1ttYXhuXTsKdmVjdG9yPGludD4gYWRqW21heG5dOwojZGVmaW5lIGFkZF9lZGdlKHUsdikgYWRqW3VdLnB1c2hfYmFjayh2KSxhZGpbdl0ucHVzaF9iYWNrKHUpCiAKaW50IG51bWJlcmluZzsKaW50IHRvdXJbMiptYXhuXTsKaW50IGJlZ1ttYXhuXSxmaW5bbWF4bl07CiAKaW50IHBhclttYXhuXVsoaW50KWxvZzIoMiptYXhuKV07CiNkZWZpbmUgcGFyZW50KHUpIHBhclt1XVswXQojZGVmaW5lIGFuY2VzKHUsaSkgcGFyW3VdW2ldCiAKaW50IGhbbWF4bl07CiNkZWZpbmUgZGVwdGgodSkgaFt1XQoKLy8vIERGUzoKdm9pZCBkZnMoY29uc3QgaW50ICZ1LGNvbnN0IGludCAmcGFyZW50LGNvbnN0IGludCAmZGVwdGgpCnsKICAgIHRvdXJbYmVnW3VdPSsrbnVtYmVyaW5nXT11OwogCiAgICBwYXJlbnQodSk9cGFyZW50OwogICAgZGVwdGgodSk9ZGVwdGg7CiAKICAgIC8vL2RwbGNhOgogICAgZm9yKGludCBpPTE7MTw8aTxuO2krKykgYW5jZXModSxpKT1hbmNlcyhhbmNlcyh1LGktMSksaS0xKTsKIAogICAgZm9yKGNvbnN0IGludCAmdjogYWRqW3VdKQogICAgICAgIGlmKCFkZXB0aCh2KSkKICAgICAgICAgICAgZGZzKHYsdSxkZXB0aCsxKTsKIAogICAgdG91cltmaW5bdV09KytudW1iZXJpbmddPXU7Cn0KIAovLy8gTENBOgppbnQgbGNhKGludCB4LGludCB5KQp7CiAgICBpZihkZXB0aCh4KTxkZXB0aCh5KSkgc3dhcCh4LHkpOwogCiAgICB3aGlsZShkZXB0aCh4KT5kZXB0aCh5KSkgeD1hbmNlcyh4LChpbnQpbG9nMihkZXB0aCh4KS1kZXB0aCh5KSkpOwogCiAgICBpbnQgbGc9bG9nMihkZXB0aCh4KSk7CiAKICAgIHdoaWxlKHghPXkpCiAgICB7CiAgICAgICAgd2hpbGUobGc+MCAmJiBhbmNlcyh4LGxnKT09YW5jZXMoeSxsZykpIC0tbGc7CiAgICAgICAgeD1hbmNlcyh4LGxnKSx5PWFuY2VzKHksbGcpOwogICAgfQogCiAgICByZXR1cm4geDsKfQogCi8vLyBNTyBhbGdvOgojZGVmaW5lIHNxcnQybiAoKGludCkoc3FydCgyKm4pKSkKI2RlZmluZSBibG9jayhpKSAoaS9zcXJ0Mm4pCnN0cnVjdCBxdWVyeXsKICAgIGludCBpZCxsZWZ0LHJpZ2h0OwogICAgaW50IHNwZWNpYWw7CiAKICAgIHF1ZXJ5KGNvbnN0IGludCAmeCxjb25zdCBpbnQgJnksY29uc3QgaW50ICZpKQogICAgewogICAgICAgIGlkPWk7CiAgICAgICAgaW50IHU9eCx2PXk7CiAgICAgICAgaWYoYmVnW3VdPmJlZ1t2XSkgc3dhcCh1LHYpOwogCiAgICAgICAgaW50IGxjYW5jPWxjYSh1LHYpOwogCiAgICAgICAgc3BlY2lhbD0obGNhbmMhPXUpP2xjYW5jOjA7CiAKICAgICAgICBsZWZ0PSFzcGVjaWFsP2JlZ1t1XTpmaW5bdV07CiAgICAgICAgcmlnaHQ9YmVnW3ZdOwogICAgfQogCiAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHF1ZXJ5ICZxKSBjb25zdHsKICAgICAgICByZXR1cm4gKGJsb2NrKGxlZnQpIT1ibG9jayhxLmxlZnQpKT9sZWZ0PHEubGVmdDpyaWdodDxxLnJpZ2h0OwogICAgfQp9OwogCmludCBDTlRFUj0wOwojZGVmaW5lIG9ucGF0aCh2ZXIsbGVmdCxyaWdodCkgKCEoKGxlZnQ8PWJlZ1t2ZXJdICYmIGZpblt2ZXJdPD1yaWdodCkgfHwgKGZpblt2ZXJdPGxlZnQgJiYgYmVnW3Zlcl0+cmlnaHQpKSkKIAp2b2lkIGFkZChjb25zdCBpbnQgJmksY29uc3QgaW50ICZsLGNvbnN0IGludCAmcikKewogICAgaWYob25wYXRoKHRvdXJbaV0sbCxyKSkgQ05URVIrPSFjW2FbdG91cltpXV1dLGNbYVt0b3VyW2ldXV0rKzsKICAgIGVsc2UgY1thW3RvdXJbaV1dXS0tLENOVEVSLT0hY1thW3RvdXJbaV1dXTsKfQp2b2lkIGRlbChjb25zdCBpbnQgJmksY29uc3QgaW50ICZsLGNvbnN0IGludCAmcikKewogICAgaWYob25wYXRoKHRvdXJbaV0sbCxyKSkgY1thW3RvdXJbaV1dXS0tLENOVEVSLT0hY1thW3RvdXJbaV1dXTsKICAgIGVsc2UgQ05URVIrPSFjW2FbdG91cltpXV1dLGNbYVt0b3VyW2ldXV0rKzsKfQogCi8vL01BSU46CmludCBtYWluKCkKewogICAgI2lmZGVmIGRtZGQKICAgIGZyZW9wZW4odGFnIi5pbnAiLCJyIixzdGRpbik7IGZyZW9wZW4odGFnIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgI2VuZGlmIC8vIGRtZGQKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogCiAgICAvLy9pbnB1dDoKICAgIGNpbj4+bj4+bTsKICAgIHZlY3RvcjxpbnQ+IGQ7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgY2luPj5hW2ldLGQucHVzaF9iYWNrKGFbaV0pOwogICAgc29ydChkLmJlZ2luKCksZC5lbmQoKSk7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgYVtpXT1sb3dlcl9ib3VuZChkLmJlZ2luKCksZC5lbmQoKSxhW2ldKS1kLmJlZ2luKCkrMTsKIAogICAgaW50IHUsdjsKICAgIGxvb3Aobi0xKSBjaW4+PnU+PnYsYWRkX2VkZ2UodSx2KTsKIAogICAgZGZzKDEsMCwxKTsKIAogICAgdmVjdG9yPHF1ZXJ5PiBROwogICAgdmVjdG9yPGludD4gYW5zKG0pOwogCiAgICBmb3IoaW50IGk9MDtpPG07aSsrKSBjaW4+PnU+PnYsUS5wdXNoX2JhY2socXVlcnkodSx2LGkpKTsKIAogICAgc29ydChRLmJlZ2luKCksUS5lbmQoKSk7CiAKICAgIGludCBsPTEscj0wLEw9MSxSPTA7CiAKICAgIGZvcihjb25zdCBhdXRvICZxOiBRKQogICAgewogICAgICAgIEw9cS5sZWZ0LFI9cS5yaWdodDsKIAogICAgICAgIHdoaWxlIChsPkwpIC0tbCxhZGQobCxsLHIpOwogICAgICAgIHdoaWxlIChyPFIpICsrcixhZGQocixsLHIpOwogICAgICAgIHdoaWxlIChsPEwpIGRlbChsLGwsciksbCsrOwogICAgICAgIHdoaWxlIChyPlIpIGRlbChyLGwsciksci0tOwogCiAgICAgICAgYW5zW3EuaWRdPUNOVEVSICsgKHEuc3BlY2lhbCAmJiBjW2FbcS5zcGVjaWFsXV09PTApOwogICAgfQogCiAgICBmb3IoY29uc3QgaW50ICZyZXA6IGFucykgY291dDw8cmVwPDwiXG4iOwogCiAgICByZXR1cm4gMDsKfQ==