#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 5e3 + 10, M = N * 4;
typedef pair<int, int> PII;
int n, m;
int h[N], e[M], w[M], ne[M], idx;
int belong[N];
int dist[N];
bool st[N];
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
int spfa(int u,int v)
{
memset(dist,0x3f,sizeof dist);//初始化所有点的距离
dist[u]=0;
queue<int>q;//定义一个队列存储待更新的点
q.push(u);//把一号点放到队列中
st[u]=true;//st数组存的是当前这个点是不是在队列当中,防止我们队列当中储存重复的点
while(q.size())
{
int t=q.front();//取出队头
q.pop();//删掉队头
st[t]=false;//点从队列中出来了
for(int i=h[t];i!=-1;i=ne[i])//更新t的所有临边
{
int j=e[i];//用j表示当前这个点
if(dist[j]>dist[t]+w[i])//看一下这个点能不能更新
{
dist[j]=dist[t]+w[i];
if(!st[j])//如果j不在队列中
{
q.push(j);//把j加入队列
st[j]=true;//标记j已经在队列中
}
}
}
}
return dist[v];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
memset(h, -1, sizeof h);
for (int i = 1; i <= n; ++ i )
{
int x;
cin >> x;
belong[i] = x;
}
for (int i = 1; i < n; ++ i )
{
int a, b;
cin >> a >> b;
a = belong[a], b = belong[b];
add(a, b, 1), add(b, a, 1);
}
while (m -- )
{
int a, b;
cin >> a >> b;
cout<<spfa(belong[a], belong[b])<<endl;
}
return 0;
}