#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;
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);
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<int> U(q+1), V(q+1), W(q+1);
vector<long long> need(q+1);
vector<long long> all;
all.reserve(n+q+5);
for(int i=1;i<=n;i++) all.push_back(f[i]);
for(int i=1;i<=q;i++){
int u,v; cin>>u>>v;
U[i]=u; V[i]=v; W[i]=lca(u,v);
need[i]=f[u]-val[u];
all.push_back(need[i]);
}
sort(all.begin(), all.end());
all.erase(unique(all.begin(), all.end()), all.end());
int M = (int)all.size();
auto posF = [&](long long x){ return (int)(lower_bound(all.begin(),all.end(),x)-all.begin())+1; };
auto posNeed = [&](long long x){ return (int)(upper_bound(all.begin(),all.end(),x)-all.begin()); };
vector<int> fpos(n+1);
for(int i=1;i<=n;i++) fpos[i]=posF(f[i]);
vector<int> needpos(q+1);
for(int i=1;i<=q;i++) needpos[i]=posNeed(need[i]);
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,0);
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(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";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTE9HID0gMjA7CgpzdHJ1Y3QgQklUIHsKICAgIGludCBuOyB2ZWN0b3I8aW50PiBiOwogICAgdm9pZCBpbml0KGludCBfbil7IG49X247IGIuYXNzaWduKG4rMSwwKTsgfQogICAgdm9pZCBhZGQoaW50IGksaW50IHYpeyBmb3IoOyBpPD1uOyBpKz1pJi1pKSBiW2ldKz12OyB9CiAgICBpbnQgc3VtKGludCBpKXsgaW50IHI9MDsgZm9yKDsgaT4wOyBpLT1pJi1pKSByKz1iW2ldOyByZXR1cm4gcjsgfQp9OwoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG4scTsgCiAgICBpZighKGNpbj4+bj4+cSkpIHJldHVybiAwOwoKICAgIHZlY3RvcjxpbnQ+IHZhbChuKzEpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIGNpbj4+dmFsW2ldOwoKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZyhuKzEpOwogICAgZm9yKGludCBpPTE7aTxuO2krKyl7CiAgICAgICAgaW50IHUsdjsgY2luPj51Pj52OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHYpOyBnW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KCiAgICB2ZWN0b3I8YXJyYXk8aW50LExPRz4+IHVwKG4rMSk7CiAgICB2ZWN0b3I8aW50PiBkZXB0aChuKzEpOwogICAgdmVjdG9yPGxvbmcgbG9uZz4gZihuKzEpOwoKICAgIGZ1bmN0aW9uPHZvaWQoaW50LGludCk+IGRmczAgPSBbJl0oaW50IHUsaW50IHApewogICAgICAgIHVwW3VdWzBdPXA7CiAgICAgICAgZm9yKGludCBqPTE7ajxMT0c7aisrKSB1cFt1XVtqXT11cFsgdXBbdV1bai0xXSBdW2otMV07CiAgICAgICAgZm9yKGludCB2OiBnW3VdKSBpZih2IT1wKXsKICAgICAgICAgICAgZGVwdGhbdl09ZGVwdGhbdV0rMTsKICAgICAgICAgICAgZlt2XT1mW3VdK3ZhbFt2XTsKICAgICAgICAgICAgZGZzMCh2LHUpOwogICAgICAgIH0KICAgIH07CiAgICBmWzFdPXZhbFsxXTsKICAgIGRmczAoMSwwKTsKCiAgICBhdXRvIGxjYSA9IFsmXShpbnQgYSxpbnQgYil7CiAgICAgICAgaWYoZGVwdGhbYV08ZGVwdGhbYl0pIHN3YXAoYSxiKTsKICAgICAgICBpbnQgayA9IGRlcHRoW2FdLWRlcHRoW2JdOwogICAgICAgIGZvcihpbnQgaj1MT0ctMTtqPj0wO2otLSkgaWYoaz4+aiYxKSBhPXVwW2FdW2pdOwogICAgICAgIGlmKGE9PWIpIHJldHVybiBhOwogICAgICAgIGZvcihpbnQgaj1MT0ctMTtqPj0wO2otLSkgaWYodXBbYV1bal0hPXVwW2JdW2pdKXsKICAgICAgICAgICAgYT11cFthXVtqXTsgYj11cFtiXVtqXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVwW2FdWzBdOwogICAgfTsKCiAgICB2ZWN0b3I8aW50PiBVKHErMSksIFYocSsxKSwgVyhxKzEpOwogICAgdmVjdG9yPGxvbmcgbG9uZz4gbmVlZChxKzEpOwogICAgdmVjdG9yPGxvbmcgbG9uZz4gYWxsOwogICAgYWxsLnJlc2VydmUobitxKzUpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIGFsbC5wdXNoX2JhY2soZltpXSk7CgogICAgZm9yKGludCBpPTE7aTw9cTtpKyspewogICAgICAgIGludCB1LHY7IGNpbj4+dT4+djsKICAgICAgICBVW2ldPXU7IFZbaV09djsgV1tpXT1sY2EodSx2KTsKICAgICAgICBuZWVkW2ldPWZbdV0tdmFsW3VdOwogICAgICAgIGFsbC5wdXNoX2JhY2sobmVlZFtpXSk7CiAgICB9CgogICAgc29ydChhbGwuYmVnaW4oKSwgYWxsLmVuZCgpKTsKICAgIGFsbC5lcmFzZSh1bmlxdWUoYWxsLmJlZ2luKCksIGFsbC5lbmQoKSksIGFsbC5lbmQoKSk7CiAgICBpbnQgTSA9IChpbnQpYWxsLnNpemUoKTsKCiAgICBhdXRvIHBvc0YgICAgPSBbJl0obG9uZyBsb25nIHgpeyByZXR1cm4gKGludCkobG93ZXJfYm91bmQoYWxsLmJlZ2luKCksYWxsLmVuZCgpLHgpLWFsbC5iZWdpbigpKSsxOyB9OwogICAgYXV0byBwb3NOZWVkID0gWyZdKGxvbmcgbG9uZyB4KXsgcmV0dXJuIChpbnQpKHVwcGVyX2JvdW5kKGFsbC5iZWdpbigpLGFsbC5lbmQoKSx4KS1hbGwuYmVnaW4oKSk7IH07CgogICAgdmVjdG9yPGludD4gZnBvcyhuKzEpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIGZwb3NbaV09cG9zRihmW2ldKTsKCiAgICB2ZWN0b3I8aW50PiBuZWVkcG9zKHErMSk7CiAgICBmb3IoaW50IGk9MTtpPD1xO2krKykgbmVlZHBvc1tpXT1wb3NOZWVkKG5lZWRbaV0pOwoKICAgIHZlY3Rvcjx2ZWN0b3I8dHVwbGU8aW50LGludCxpbnQ+Pj4gZ3UobisxKTsKICAgIGZvcihpbnQgaT0xO2k8PXE7aSsrKXsKICAgICAgICBndVtVW2ldXS5wdXNoX2JhY2soe2ksIG5lZWRwb3NbaV0sICsxfSk7CiAgICAgICAgZ3VbVltpXV0ucHVzaF9iYWNrKHtpLCBuZWVkcG9zW2ldLCArMX0pOwogICAgICAgIGd1W1dbaV1dLnB1c2hfYmFjayh7aSwgbmVlZHBvc1tpXSwgLTJ9KTsKICAgIH0KCiAgICB2ZWN0b3I8bG9uZyBsb25nPiBhbnMocSsxLDApOwogICAgZm9yKGludCBpPTE7aTw9cTtpKyspIGlmKGZbV1tpXV0gPiBuZWVkW2ldKSBhbnNbaV0rKzsKCiAgICBCSVQgYml0OyBiaXQuaW5pdChNKTsKCiAgICBmdW5jdGlvbjx2b2lkKGludCxpbnQpPiBkZnMgPSBbJl0oaW50IHUsaW50IHApewogICAgICAgIGJpdC5hZGQoZnBvc1t1XSwxKTsKICAgICAgICBmb3IoYXV0byBbaWQsIGlkeCwgc10gOiBndVt1XSl7CiAgICAgICAgICAgIGludCBncmVhdGVyID0gYml0LnN1bShpZHgpOwogICAgICAgICAgICBhbnNbaWRdICs9IDFMTCpzKmdyZWF0ZXI7CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgdjogZ1t1XSkgaWYodiE9cCkgZGZzKHYsdSk7CiAgICAgICAgYml0LmFkZChmcG9zW3VdLC0xKTsKICAgIH07CiAgICBkZnMoMSwwKTsKCiAgICBmb3IoaW50IGk9MTtpPD1xO2krKykgY291dDw8YW5zW2ldPDwiXG4iOwogICAgcmV0dXJuIDA7Cn0K