#include <bits/stdc++.h>
using namespace std;
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; cin>>n>>q;
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); vector<long long> f(n+1);
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;
f[v]=f[u]+val[v];
dfs0(v,u);
}
};
f[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<long long> vals;
for(int i=1;i<=n;i++) vals.push_back(f[i]);
vector<int> U(q+1),V(q+1),W(q+1);
vector<long long> need(q+1);
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;
need[i]=f[u]+f[v]-2*f[w]-val[w];
vals.push_back(need[i]);
}
sort(vals.begin(),vals.end()); vals.erase(unique(vals.begin(),vals.end()),vals.end());
auto get=[&](long long x){return (int)(lower_bound(vals.begin(),vals.end(),x)-vals.begin())+1;};
int M=vals.size();
vector<int> fpos(n+1); for(int i=1;i<=n;i++) fpos[i]=get(f[i]);
vector<int> needpos(q+1); for(int i=1;i<=q;i++) needpos[i]=upper_bound(vals.begin(),vals.end(),need[i])-vals.begin();
vector<vector<tuple<int,int,int>>> gu(n+1);
for(int i=1;i<=q;i++){
gu[U[i]].push_back({i,needpos[i],+1});
gu[V[i]].push_back({i,needpos[i],+1});
gu[W[i]].push_back({i,needpos[i],-2});
}
vector<long long> ans(q+1);
for(int i=1;i<=q;i++) if(f[W[i]]>need[i]) ans[i]++;
BIT bit; bit.init(M);
function<void(int,int)> dfs=[&](int u,int p){
bit.add(fpos[u],1);
for(auto [id,idx,s]:gu[u]){
int greater=bit.sum(M)-bit.sum(idx);
ans[id]+=1LL*s*greater;
}
for(int v:g[u]) if(v!=p) dfs(v,u);
bit.add(fpos[u],-1);
};
dfs(1,0);
for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBMT0cgPSAyMDsKc3RydWN0IEJJVHsKICAgIGludCBuOyB2ZWN0b3I8aW50PiBiOwogICAgdm9pZCBpbml0KGludCBfbil7IG49X247IGIuYXNzaWduKG4rMSwwKTsgfQogICAgdm9pZCBhZGQoaW50IGksaW50IHYpeyBmb3IoO2k8PW47aSs9aSYtaSkgYltpXSs9djsgfQogICAgaW50IHN1bShpbnQgaSl7IGludCByPTA7IGZvcig7aT4wO2ktPWkmLWkpIHIrPWJbaV07IHJldHVybiByOyB9Cn07CmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgaW50IG4scTsgY2luPj5uPj5xOwogICAgdmVjdG9yPGludD4gdmFsKG4rMSk7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgY2luPj52YWxbaV07CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGcobisxKTsKICAgIGZvcihpbnQgaT0xO2k8bjtpKyspe2ludCB1LHY7Y2luPj51Pj52O2dbdV0ucHVzaF9iYWNrKHYpO2dbdl0ucHVzaF9iYWNrKHUpO30KICAgIHZlY3RvcjxhcnJheTxpbnQsTE9HPj4gdXAobisxKTsKICAgIHZlY3RvcjxpbnQ+IGRlcHRoKG4rMSk7IHZlY3Rvcjxsb25nIGxvbmc+IGYobisxKTsKICAgIGZ1bmN0aW9uPHZvaWQoaW50LGludCk+IGRmczA9WyZdKGludCB1LGludCBwKXsKICAgICAgICB1cFt1XVswXT1wOwogICAgICAgIGZvcihpbnQgaj0xO2o8TE9HO2orKykgdXBbdV1bal09dXBbIHVwW3VdW2otMV0gXVtqLTFdOwogICAgICAgIGZvcihpbnQgdjpnW3VdKSBpZih2IT1wKXsKICAgICAgICAgICAgZGVwdGhbdl09ZGVwdGhbdV0rMTsKICAgICAgICAgICAgZlt2XT1mW3VdK3ZhbFt2XTsKICAgICAgICAgICAgZGZzMCh2LHUpOwogICAgICAgIH0KICAgIH07CiAgICBmWzFdPXZhbFsxXTsgZGZzMCgxLDApOwogICAgYXV0byBsY2E9WyZdKGludCBhLGludCBiKXsKICAgICAgICBpZihkZXB0aFthXTxkZXB0aFtiXSkgc3dhcChhLGIpOwogICAgICAgIGludCBrPWRlcHRoW2FdLWRlcHRoW2JdOwogICAgICAgIGZvcihpbnQgaj1MT0ctMTtqPj0wO2otLSkgaWYoaz4+aiYxKSBhPXVwW2FdW2pdOwogICAgICAgIGlmKGE9PWIpIHJldHVybiBhOwogICAgICAgIGZvcihpbnQgaj1MT0ctMTtqPj0wO2otLSkgaWYodXBbYV1bal0hPXVwW2JdW2pdKXthPXVwW2FdW2pdO2I9dXBbYl1bal07fQogICAgICAgIHJldHVybiB1cFthXVswXTsKICAgIH07CiAgICB2ZWN0b3I8bG9uZyBsb25nPiB2YWxzOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIHZhbHMucHVzaF9iYWNrKGZbaV0pOwogICAgdmVjdG9yPGludD4gVShxKzEpLFYocSsxKSxXKHErMSk7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBuZWVkKHErMSk7CiAgICBmb3IoaW50IGk9MTtpPD1xO2krKyl7CiAgICAgICAgaW50IHUsdjtjaW4+PnU+PnY7CiAgICAgICAgVVtpXT11O1ZbaV09djtpbnQgdz1sY2EodSx2KTtXW2ldPXc7CiAgICAgICAgbmVlZFtpXT1mW3VdK2Zbdl0tMipmW3ddLXZhbFt3XTsKICAgICAgICB2YWxzLnB1c2hfYmFjayhuZWVkW2ldKTsKICAgIH0KICAgIHNvcnQodmFscy5iZWdpbigpLHZhbHMuZW5kKCkpOyB2YWxzLmVyYXNlKHVuaXF1ZSh2YWxzLmJlZ2luKCksdmFscy5lbmQoKSksdmFscy5lbmQoKSk7CiAgICBhdXRvIGdldD1bJl0obG9uZyBsb25nIHgpe3JldHVybiAoaW50KShsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksdmFscy5lbmQoKSx4KS12YWxzLmJlZ2luKCkpKzE7fTsKICAgIGludCBNPXZhbHMuc2l6ZSgpOwogICAgdmVjdG9yPGludD4gZnBvcyhuKzEpOyBmb3IoaW50IGk9MTtpPD1uO2krKykgZnBvc1tpXT1nZXQoZltpXSk7CiAgICB2ZWN0b3I8aW50PiBuZWVkcG9zKHErMSk7IGZvcihpbnQgaT0xO2k8PXE7aSsrKSBuZWVkcG9zW2ldPXVwcGVyX2JvdW5kKHZhbHMuYmVnaW4oKSx2YWxzLmVuZCgpLG5lZWRbaV0pLXZhbHMuYmVnaW4oKTsKICAgIHZlY3Rvcjx2ZWN0b3I8dHVwbGU8aW50LGludCxpbnQ+Pj4gZ3UobisxKTsKICAgIGZvcihpbnQgaT0xO2k8PXE7aSsrKXsKICAgICAgICBndVtVW2ldXS5wdXNoX2JhY2soe2ksbmVlZHBvc1tpXSwrMX0pOwogICAgICAgIGd1W1ZbaV1dLnB1c2hfYmFjayh7aSxuZWVkcG9zW2ldLCsxfSk7CiAgICAgICAgZ3VbV1tpXV0ucHVzaF9iYWNrKHtpLG5lZWRwb3NbaV0sLTJ9KTsKICAgIH0KICAgIHZlY3Rvcjxsb25nIGxvbmc+IGFucyhxKzEpOwogICAgZm9yKGludCBpPTE7aTw9cTtpKyspIGlmKGZbV1tpXV0+bmVlZFtpXSkgYW5zW2ldKys7CiAgICBCSVQgYml0OyBiaXQuaW5pdChNKTsKICAgIGZ1bmN0aW9uPHZvaWQoaW50LGludCk+IGRmcz1bJl0oaW50IHUsaW50IHApewogICAgICAgIGJpdC5hZGQoZnBvc1t1XSwxKTsKICAgICAgICBmb3IoYXV0byBbaWQsaWR4LHNdOmd1W3VdKXsKICAgICAgICAgICAgaW50IGdyZWF0ZXI9Yml0LnN1bShNKS1iaXQuc3VtKGlkeCk7CiAgICAgICAgICAgIGFuc1tpZF0rPTFMTCpzKmdyZWF0ZXI7CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgdjpnW3VdKSBpZih2IT1wKSBkZnModix1KTsKICAgICAgICBiaXQuYWRkKGZwb3NbdV0sLTEpOwogICAgfTsKICAgIGRmcygxLDApOwogICAgZm9yKGludCBpPTE7aTw9cTtpKyspIGNvdXQ8PGFuc1tpXTw8IlxuIjsKfQo=