#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, q, val[MAXN];
vector<int> g[MAXN];
int tin[MAXN], tout[MAXN], euler[2*MAXN], timer;
int up[MAXN][20], depth[MAXN];
long long fenw[MAXN*2];
void upd(int i, long long v) {
for (; i <= 2*n; i += i&-i) fenw[i] += v;
}
long long get(int i) {
long long r = 0;
for (; i; i -= i&-i) r += fenw[i];
return r;
}
long long query(int l, int r) {
return get(r) - get(l-1);
}
void dfs(int u, int p) {
tin[u] = ++timer;
euler[timer] = u;
up[u][0] = p;
for (int i=1; i<20; i++) up[u][i] = up[up[u][i-1]][i-1];
for (int v:g[u]) if (v!=p) {
depth[v] = depth[u]+1;
dfs(v,u);
}
tout[u] = ++timer;
euler[timer] = -u;
}
int lca(int u,int v){
if(depth[u]<depth[v]) swap(u,v);
int k=depth[u]-depth[v];
for(int i=19;i>=0;i--) if(k>>i&1) u=up[u][i];
if(u==v) return u;
for(int i=19;i>=0;i--) if(up[u][i]!=up[v][i]){
u=up[u][i]; v=up[v][i];
}
return up[u][0];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>val[i];
for(int i=1;i<n;i++){
int u,v; cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,1);
for(int i=1;i<=2*n;i++){
int u=euler[i];
if(u>0) upd(i,val[u]);
else upd(i,-val[-u]);
}
while(q--){
int u,v; cin>>u>>v;
int w=lca(u,v);
long long sum=query(tin[u],tin[v])+val[w];
int ans=0;
if(sum>0){
if(depth[u]<depth[v]) swap(u,v);
while(u!=w){
if(val[u]==1) ans++;
u=up[u][0];
}
while(v!=w){
if(val[v]==1) ans++;
v=up[v][0];
}
if(val[w]==1) ans++;
}
cout<<ans<<"\n";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDEwMDAwNTsKaW50IG4sIHEsIHZhbFtNQVhOXTsKdmVjdG9yPGludD4gZ1tNQVhOXTsKaW50IHRpbltNQVhOXSwgdG91dFtNQVhOXSwgZXVsZXJbMipNQVhOXSwgdGltZXI7CmludCB1cFtNQVhOXVsyMF0sIGRlcHRoW01BWE5dOwpsb25nIGxvbmcgZmVud1tNQVhOKjJdOwoKdm9pZCB1cGQoaW50IGksIGxvbmcgbG9uZyB2KSB7CiAgICBmb3IgKDsgaSA8PSAyKm47IGkgKz0gaSYtaSkgZmVud1tpXSArPSB2Owp9CmxvbmcgbG9uZyBnZXQoaW50IGkpIHsKICAgIGxvbmcgbG9uZyByID0gMDsKICAgIGZvciAoOyBpOyBpIC09IGkmLWkpIHIgKz0gZmVud1tpXTsKICAgIHJldHVybiByOwp9CmxvbmcgbG9uZyBxdWVyeShpbnQgbCwgaW50IHIpIHsKICAgIHJldHVybiBnZXQocikgLSBnZXQobC0xKTsKfQoKdm9pZCBkZnMoaW50IHUsIGludCBwKSB7CiAgICB0aW5bdV0gPSArK3RpbWVyOwogICAgZXVsZXJbdGltZXJdID0gdTsKICAgIHVwW3VdWzBdID0gcDsKICAgIGZvciAoaW50IGk9MTsgaTwyMDsgaSsrKSB1cFt1XVtpXSA9IHVwW3VwW3VdW2ktMV1dW2ktMV07CiAgICBmb3IgKGludCB2OmdbdV0pIGlmICh2IT1wKSB7CiAgICAgICAgZGVwdGhbdl0gPSBkZXB0aFt1XSsxOwogICAgICAgIGRmcyh2LHUpOwogICAgfQogICAgdG91dFt1XSA9ICsrdGltZXI7CiAgICBldWxlclt0aW1lcl0gPSAtdTsKfQoKaW50IGxjYShpbnQgdSxpbnQgdil7CiAgICBpZihkZXB0aFt1XTxkZXB0aFt2XSkgc3dhcCh1LHYpOwogICAgaW50IGs9ZGVwdGhbdV0tZGVwdGhbdl07CiAgICBmb3IoaW50IGk9MTk7aT49MDtpLS0pIGlmKGs+PmkmMSkgdT11cFt1XVtpXTsKICAgIGlmKHU9PXYpIHJldHVybiB1OwogICAgZm9yKGludCBpPTE5O2k+PTA7aS0tKSBpZih1cFt1XVtpXSE9dXBbdl1baV0pewogICAgICAgIHU9dXBbdV1baV07IHY9dXBbdl1baV07CiAgICB9CiAgICByZXR1cm4gdXBbdV1bMF07Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CiAgICBjaW4+Pm4+PnE7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgY2luPj52YWxbaV07CiAgICBmb3IoaW50IGk9MTtpPG47aSsrKXsKICAgICAgICBpbnQgdSx2OyBjaW4+PnU+PnY7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICBkZnMoMSwxKTsKICAgIGZvcihpbnQgaT0xO2k8PTIqbjtpKyspewogICAgICAgIGludCB1PWV1bGVyW2ldOwogICAgICAgIGlmKHU+MCkgdXBkKGksdmFsW3VdKTsKICAgICAgICBlbHNlIHVwZChpLC12YWxbLXVdKTsKICAgIH0KICAgIHdoaWxlKHEtLSl7CiAgICAgICAgaW50IHUsdjsgY2luPj51Pj52OwogICAgICAgIGludCB3PWxjYSh1LHYpOwogICAgICAgIGxvbmcgbG9uZyBzdW09cXVlcnkodGluW3VdLHRpblt2XSkrdmFsW3ddOwogICAgICAgIGludCBhbnM9MDsKICAgICAgICBpZihzdW0+MCl7CiAgICAgICAgICAgIGlmKGRlcHRoW3VdPGRlcHRoW3ZdKSBzd2FwKHUsdik7CiAgICAgICAgICAgIHdoaWxlKHUhPXcpewogICAgICAgICAgICAgICAgaWYodmFsW3VdPT0xKSBhbnMrKzsKICAgICAgICAgICAgICAgIHU9dXBbdV1bMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUodiE9dyl7CiAgICAgICAgICAgICAgICBpZih2YWxbdl09PTEpIGFucysrOwogICAgICAgICAgICAgICAgdj11cFt2XVswXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih2YWxbd109PTEpIGFucysrOwogICAgICAgIH0KICAgICAgICBjb3V0PDxhbnM8PCJcbiI7CiAgICB9Cn0K