#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int LOG = 20;
struct BIT {
int n; vector<int> b;
void init(int _n){ n=_n; b.assign(n+1,0); }
void add(int i,int v){ for(; i<=n; i+=i&-i) b[i]+=v; }
int sum(int i){ int r=0; for(; i>0; i-=i&-i) r+=b[i]; return r; }
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,q;
if(!(cin>>n>>q)) return 0;
vector<int> val(n+1);
for(int i=1;i<=n;i++) cin>>val[i];
vector<vector<int>> g(n+1);
for(int i=1;i<n;i++){
int u,v; cin>>u>>v;
g[u].push_back(v); g[v].push_back(u);
}
vector<array<int,LOG>> up(n+1);
vector<int> depth(n+1,0);
vector<ll> S(n+1,0);
function<void(int,int)> dfs0 = [&](int u,int p){
up[u][0]=p;
for(int j=1;j<LOG;j++) up[u][j]=up[ up[u][j-1] ][j-1];
for(int v:g[u]) if(v!=p){
depth[v]=depth[u]+1;
S[v]=S[u]+val[v];
dfs0(v,u);
}
};
S[1]=val[1];
dfs0(1,0);
auto lca = [&](int a,int b){
if(depth[a]<depth[b]) swap(a,b);
int k=depth[a]-depth[b];
for(int j=LOG-1;j>=0;j--) if(k>>j&1) a=up[a][j];
if(a==b) return a;
for(int j=LOG-1;j>=0;j--) if(up[a][j]!=up[b][j]){
a=up[a][j]; b=up[b][j];
}
return up[a][0];
};
vector<vector<tuple<int,int,int>>> gu(n+1);
vector<ll> needv(q+1);
vector<int> U(q+1),V(q+1),W(q+1);
vector<ll> vals;
vals.reserve(n+q+5);
for(int i=1;i<=n;i++) vals.push_back(S[i]);
for(int i=1;i<=q;i++){
int u,v; cin>>u>>v;
U[i]=u; V[i]=v;
int w = lca(u,v);
W[i]=w;
needv[i]=S[u]-2*S[w];
vals.push_back(needv[i]);
}
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
int M = (int)vals.size();
vector<int> Spos(n+1);
for(int i=1;i<=n;i++) Spos[i]= (int)(lower_bound(vals.begin(), vals.end(), S[i]) - vals.begin()) + 1;
for(int i=1;i<=q;i++){
int idxNeed = (int)(upper_bound(vals.begin(), vals.end(), needv[i]) - vals.begin());
gu[U[i]].push_back({i, idxNeed, +1});
gu[V[i]].push_back({i, idxNeed, +1});
gu[W[i]].push_back({i, idxNeed, -2});
}
vector<ll> ans(q+1,0);
for(int i=1;i<=q;i++){
if(S[ W[i] ] > needv[i]) ans[i]++;
}
BIT bit; bit.init(M);
function<void(int,int)> dfs = [&](int u,int p){
bit.add(Spos[u],1);
for(auto &t: gu[u]){
int id, idxNeed, sign;
tie(id, idxNeed, sign) = t;
int greater = bit.sum(M) - bit.sum(idxNeed);
ans[id] += 1LL*sign*greater;
}
for(int v: g[u]) if(v!=p) dfs(v,u);
bit.add(Spos[u],-1);
};
dfs(1,0);
for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwpjb25zdCBpbnQgTE9HID0gMjA7CgpzdHJ1Y3QgQklUIHsKICAgIGludCBuOyB2ZWN0b3I8aW50PiBiOwogICAgdm9pZCBpbml0KGludCBfbil7IG49X247IGIuYXNzaWduKG4rMSwwKTsgfQogICAgdm9pZCBhZGQoaW50IGksaW50IHYpeyBmb3IoOyBpPD1uOyBpKz1pJi1pKSBiW2ldKz12OyB9CiAgICBpbnQgc3VtKGludCBpKXsgaW50IHI9MDsgZm9yKDsgaT4wOyBpLT1pJi1pKSByKz1iW2ldOyByZXR1cm4gcjsgfQp9OwoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBpbnQgbixxOwogICAgaWYoIShjaW4+Pm4+PnEpKSByZXR1cm4gMDsKICAgIHZlY3RvcjxpbnQ+IHZhbChuKzEpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIGNpbj4+dmFsW2ldOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBnKG4rMSk7CiAgICBmb3IoaW50IGk9MTtpPG47aSsrKXsKICAgICAgICBpbnQgdSx2OyBjaW4+PnU+PnY7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7IGdbdl0ucHVzaF9iYWNrKHUpOwogICAgfQogICAgdmVjdG9yPGFycmF5PGludCxMT0c+PiB1cChuKzEpOwogICAgdmVjdG9yPGludD4gZGVwdGgobisxLDApOwogICAgdmVjdG9yPGxsPiBTKG4rMSwwKTsKICAgIGZ1bmN0aW9uPHZvaWQoaW50LGludCk+IGRmczAgPSBbJl0oaW50IHUsaW50IHApewogICAgICAgIHVwW3VdWzBdPXA7CiAgICAgICAgZm9yKGludCBqPTE7ajxMT0c7aisrKSB1cFt1XVtqXT11cFsgdXBbdV1bai0xXSBdW2otMV07CiAgICAgICAgZm9yKGludCB2OmdbdV0pIGlmKHYhPXApewogICAgICAgICAgICBkZXB0aFt2XT1kZXB0aFt1XSsxOwogICAgICAgICAgICBTW3ZdPVNbdV0rdmFsW3ZdOwogICAgICAgICAgICBkZnMwKHYsdSk7CiAgICAgICAgfQogICAgfTsKICAgIFNbMV09dmFsWzFdOwogICAgZGZzMCgxLDApOwogICAgYXV0byBsY2EgPSBbJl0oaW50IGEsaW50IGIpewogICAgICAgIGlmKGRlcHRoW2FdPGRlcHRoW2JdKSBzd2FwKGEsYik7CiAgICAgICAgaW50IGs9ZGVwdGhbYV0tZGVwdGhbYl07CiAgICAgICAgZm9yKGludCBqPUxPRy0xO2o+PTA7ai0tKSBpZihrPj5qJjEpIGE9dXBbYV1bal07CiAgICAgICAgaWYoYT09YikgcmV0dXJuIGE7CiAgICAgICAgZm9yKGludCBqPUxPRy0xO2o+PTA7ai0tKSBpZih1cFthXVtqXSE9dXBbYl1bal0pewogICAgICAgICAgICBhPXVwW2FdW2pdOyBiPXVwW2JdW2pdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdXBbYV1bMF07CiAgICB9OwogICAgdmVjdG9yPHZlY3Rvcjx0dXBsZTxpbnQsaW50LGludD4+PiBndShuKzEpOwogICAgdmVjdG9yPGxsPiBuZWVkdihxKzEpOwogICAgdmVjdG9yPGludD4gVShxKzEpLFYocSsxKSxXKHErMSk7CiAgICB2ZWN0b3I8bGw+IHZhbHM7CiAgICB2YWxzLnJlc2VydmUobitxKzUpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIHZhbHMucHVzaF9iYWNrKFNbaV0pOwogICAgZm9yKGludCBpPTE7aTw9cTtpKyspewogICAgICAgIGludCB1LHY7IGNpbj4+dT4+djsKICAgICAgICBVW2ldPXU7IFZbaV09djsKICAgICAgICBpbnQgdyA9IGxjYSh1LHYpOwogICAgICAgIFdbaV09dzsKICAgICAgICBuZWVkdltpXT1TW3VdLTIqU1t3XTsKICAgICAgICB2YWxzLnB1c2hfYmFjayhuZWVkdltpXSk7CiAgICB9CiAgICBzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7CiAgICB2YWxzLmVyYXNlKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpLCB2YWxzLmVuZCgpKTsKICAgIGludCBNID0gKGludCl2YWxzLnNpemUoKTsKICAgIHZlY3RvcjxpbnQ+IFNwb3MobisxKTsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSBTcG9zW2ldPSAoaW50KShsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIFNbaV0pIC0gdmFscy5iZWdpbigpKSArIDE7CiAgICBmb3IoaW50IGk9MTtpPD1xO2krKyl7CiAgICAgICAgaW50IGlkeE5lZWQgPSAoaW50KSh1cHBlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIG5lZWR2W2ldKSAtIHZhbHMuYmVnaW4oKSk7CiAgICAgICAgZ3VbVVtpXV0ucHVzaF9iYWNrKHtpLCBpZHhOZWVkLCArMX0pOwogICAgICAgIGd1W1ZbaV1dLnB1c2hfYmFjayh7aSwgaWR4TmVlZCwgKzF9KTsKICAgICAgICBndVtXW2ldXS5wdXNoX2JhY2soe2ksIGlkeE5lZWQsIC0yfSk7CiAgICB9CiAgICB2ZWN0b3I8bGw+IGFucyhxKzEsMCk7CiAgICBmb3IoaW50IGk9MTtpPD1xO2krKyl7CiAgICAgICAgaWYoU1sgV1tpXSBdID4gbmVlZHZbaV0pIGFuc1tpXSsrOwogICAgfQogICAgQklUIGJpdDsgYml0LmluaXQoTSk7CiAgICBmdW5jdGlvbjx2b2lkKGludCxpbnQpPiBkZnMgPSBbJl0oaW50IHUsaW50IHApewogICAgICAgIGJpdC5hZGQoU3Bvc1t1XSwxKTsKICAgICAgICBmb3IoYXV0byAmdDogZ3VbdV0pewogICAgICAgICAgICBpbnQgaWQsIGlkeE5lZWQsIHNpZ247CiAgICAgICAgICAgIHRpZShpZCwgaWR4TmVlZCwgc2lnbikgPSB0OwogICAgICAgICAgICBpbnQgZ3JlYXRlciA9IGJpdC5zdW0oTSkgLSBiaXQuc3VtKGlkeE5lZWQpOwogICAgICAgICAgICBhbnNbaWRdICs9IDFMTCpzaWduKmdyZWF0ZXI7CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgdjogZ1t1XSkgaWYodiE9cCkgZGZzKHYsdSk7CiAgICAgICAgYml0LmFkZChTcG9zW3VdLC0xKTsKICAgIH07CiAgICBkZnMoMSwwKTsKICAgIGZvcihpbnQgaT0xO2k8PXE7aSsrKSBjb3V0PDxhbnNbaV08PCJcbiI7CiAgICByZXR1cm4gMDsKfQo=