#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], timer;
int up[MAXN][20], depth[MAXN];
long long fenw1[MAXN*2], fenw2[MAXN*2];
void upd(long long fenw[], int i, long long v) {
for (; i <= 2*n; i += i&-i) fenw[i] += v;
}
long long get(long long fenw[], int i) {
long long r = 0;
for (; i; i -= i&-i) r += fenw[i];
return r;
}
void dfs(int u, int p) {
tin[u] = ++timer;
up[u][0] = p;
for (int i=1; i<20; i++) up[u][i] = up[up[u][i-1]][i-1];
upd(fenw1, tin[u], val[u]);
upd(fenw2, tin[u], (val[u]==1));
for (int v:g[u]) if (v!=p) {
depth[v] = depth[u]+1;
dfs(v,u);
}
tout[u] = ++timer;
upd(fenw1, tout[u], -val[u]);
upd(fenw2, tout[u], -(val[u]==1));
}
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);
while(q--) {
int u,v; cin >> u >> v;
int w = lca(u,v);
long long sum = get(fenw1, tin[u]) + get(fenw1, tin[v]) - 2*get(fenw1, tin[w]) + val[w];
if(sum <= 0) {
cout << 0 << "\n";
continue;
}
long long cnt = get(fenw2, tin[u]) + get(fenw2, tin[v]) - 2*get(fenw2, tin[w]) + (val[w]==1);
cout << cnt << "\n";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDEwMDAwNTsKaW50IG4sIHEsIHZhbFtNQVhOXTsKdmVjdG9yPGludD4gZ1tNQVhOXTsKaW50IHRpbltNQVhOXSwgdG91dFtNQVhOXSwgdGltZXI7CmludCB1cFtNQVhOXVsyMF0sIGRlcHRoW01BWE5dOwpsb25nIGxvbmcgZmVudzFbTUFYTioyXSwgZmVudzJbTUFYTioyXTsKCnZvaWQgdXBkKGxvbmcgbG9uZyBmZW53W10sIGludCBpLCBsb25nIGxvbmcgdikgewogICAgZm9yICg7IGkgPD0gMipuOyBpICs9IGkmLWkpIGZlbndbaV0gKz0gdjsKfQpsb25nIGxvbmcgZ2V0KGxvbmcgbG9uZyBmZW53W10sIGludCBpKSB7CiAgICBsb25nIGxvbmcgciA9IDA7CiAgICBmb3IgKDsgaTsgaSAtPSBpJi1pKSByICs9IGZlbndbaV07CiAgICByZXR1cm4gcjsKfQoKdm9pZCBkZnMoaW50IHUsIGludCBwKSB7CiAgICB0aW5bdV0gPSArK3RpbWVyOwogICAgdXBbdV1bMF0gPSBwOwogICAgZm9yIChpbnQgaT0xOyBpPDIwOyBpKyspIHVwW3VdW2ldID0gdXBbdXBbdV1baS0xXV1baS0xXTsKCiAgICB1cGQoZmVudzEsIHRpblt1XSwgdmFsW3VdKTsKICAgIHVwZChmZW53MiwgdGluW3VdLCAodmFsW3VdPT0xKSk7CgogICAgZm9yIChpbnQgdjpnW3VdKSBpZiAodiE9cCkgewogICAgICAgIGRlcHRoW3ZdID0gZGVwdGhbdV0rMTsKICAgICAgICBkZnModix1KTsKICAgIH0KCiAgICB0b3V0W3VdID0gKyt0aW1lcjsKICAgIHVwZChmZW53MSwgdG91dFt1XSwgLXZhbFt1XSk7CiAgICB1cGQoZmVudzIsIHRvdXRbdV0sIC0odmFsW3VdPT0xKSk7Cn0KCmludCBsY2EoaW50IHUsaW50IHYpewogICAgaWYoZGVwdGhbdV08ZGVwdGhbdl0pIHN3YXAodSx2KTsKICAgIGludCBrPWRlcHRoW3VdLWRlcHRoW3ZdOwogICAgZm9yKGludCBpPTE5O2k+PTA7aS0tKSBpZihrPj5pJjEpIHU9dXBbdV1baV07CiAgICBpZih1PT12KSByZXR1cm4gdTsKICAgIGZvcihpbnQgaT0xOTtpPj0wO2ktLSkgaWYodXBbdV1baV0hPXVwW3ZdW2ldKXsKICAgICAgICB1PXVwW3VdW2ldOyB2PXVwW3ZdW2ldOwogICAgfQogICAgcmV0dXJuIHVwW3VdWzBdOwp9CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKCiAgICBjaW4gPj4gbiA+PiBxOwogICAgZm9yIChpbnQgaT0xO2k8PW47aSsrKSBjaW4gPj4gdmFsW2ldOwogICAgZm9yIChpbnQgaT0xO2k8bjtpKyspIHsKICAgICAgICBpbnQgdSx2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGdbdl0ucHVzaF9iYWNrKHUpOwogICAgfQoKICAgIGRmcygxLDEpOwoKICAgIHdoaWxlKHEtLSkgewogICAgICAgIGludCB1LHY7IGNpbiA+PiB1ID4+IHY7CiAgICAgICAgaW50IHcgPSBsY2EodSx2KTsKCiAgICAgICAgbG9uZyBsb25nIHN1bSA9IGdldChmZW53MSwgdGluW3VdKSArIGdldChmZW53MSwgdGluW3ZdKSAtIDIqZ2V0KGZlbncxLCB0aW5bd10pICsgdmFsW3ddOwogICAgICAgIGlmKHN1bSA8PSAwKSB7CiAgICAgICAgICAgIGNvdXQgPDwgMCA8PCAiXG4iOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGxvbmcgbG9uZyBjbnQgPSBnZXQoZmVudzIsIHRpblt1XSkgKyBnZXQoZmVudzIsIHRpblt2XSkgLSAyKmdldChmZW53MiwgdGluW3ddKSArICh2YWxbd109PTEpOwogICAgICAgIGNvdXQgPDwgY250IDw8ICJcbiI7CiAgICB9Cn0K