#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 5;
const int LOG = 20;
int n, q;
int val[N];
vector<int> g[N];
int up[N][LOG], depth[N];
long long f[N];
int U[N], V[N], W[N];
long long needv[N];
long long ans[N];
vector<tuple<int,int,int>> gu[N];
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; }
} bit;
void dfs_init(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];
dfs_init(v,u);
}
}
int lca(int u,int v){
if(depth[u]<depth[v]) swap(u,v);
int k=depth[u]-depth[v];
for(int j=LOG-1;j>=0;j--) if(k>>j&1) u=up[u][j];
if(u==v) return u;
for(int j=LOG-1;j>=0;j--) if(up[u][j]!=up[v][j]){
u=up[u][j]; v=up[v][j];
}
return up[u][0];
}
void dfs_ans(int u,int p){
static int M = 0;
bit.add((int)f[u],1);
for(auto [id, idxNeed, sign] : gu[u]){
ans[id] += 1LL*sign*(bit.sum(M) - bit.sum(idxNeed));
}
for(int v:g[u]) if(v!=p) dfs_ans(v,u);
bit.add((int)f[u],-1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
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);
}
f[1]=val[1];
dfs_init(1,0);
vector<long long> vals;
vals.reserve(n+q);
for(int i=1;i<=n;i++) vals.push_back(f[i]);
for(int i=1;i<=q;i++){
int u,v; cin>>u>>v;
int w=lca(u,v);
U[i]=u; V[i]=v; W[i]=w;
needv[i]=f[u]+f[v]-2*f[w]+val[w];
vals.push_back(needv[i]);
}
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
for(int i=1;i<=n;i++){
f[i] = lower_bound(vals.begin(), vals.end(), f[i]) - vals.begin() + 1;
}
vector<int> idxNeed(q+1);
for(int i=1;i<=q;i++){
idxNeed[i] = upper_bound(vals.begin(), vals.end(), needv[i]) - vals.begin();
gu[U[i]].push_back({i, idxNeed[i], +1});
gu[V[i]].push_back({i, idxNeed[i], +1});
gu[W[i]].push_back({i, idxNeed[i], -2});
if((long long)(lower_bound(vals.begin(), vals.end(), f[W[i]]) - vals.begin() + 1) > idxNeed[i]) ans[i]++;
}
bit.init((int)vals.size());
dfs_ans(1,0);
for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDIwMDAwMCArIDU7CmNvbnN0IGludCBMT0cgPSAyMDsKCmludCBuLCBxOwppbnQgdmFsW05dOwp2ZWN0b3I8aW50PiBnW05dOwppbnQgdXBbTl1bTE9HXSwgZGVwdGhbTl07CmxvbmcgbG9uZyBmW05dOwoKaW50IFVbTl0sIFZbTl0sIFdbTl07CmxvbmcgbG9uZyBuZWVkdltOXTsKbG9uZyBsb25nIGFuc1tOXTsKCnZlY3Rvcjx0dXBsZTxpbnQsaW50LGludD4+IGd1W05dOwoKc3RydWN0IEJJVCB7CiAgICBpbnQgbjsgdmVjdG9yPGludD4gYjsKICAgIHZvaWQgaW5pdChpbnQgX24peyBuPV9uOyBiLmFzc2lnbihuKzEsMCk7IH0KICAgIHZvaWQgYWRkKGludCBpLGludCB2KXsgZm9yKDsgaTw9bjsgaSs9aSYtaSkgYltpXSs9djsgfQogICAgaW50IHN1bShpbnQgaSl7IGludCByPTA7IGZvcig7IGk+MDsgaS09aSYtaSkgcis9YltpXTsgcmV0dXJuIHI7IH0KfSBiaXQ7Cgp2b2lkIGRmc19pbml0KGludCB1LGludCBwKXsKICAgIHVwW3VdWzBdPXA7CiAgICBmb3IoaW50IGo9MTtqPExPRztqKyspIHVwW3VdW2pdPXVwW3VwW3VdW2otMV1dW2otMV07CiAgICBmb3IoaW50IHY6Z1t1XSkgaWYodiE9cCl7CiAgICAgICAgZGVwdGhbdl09ZGVwdGhbdV0rMTsKICAgICAgICBmW3ZdPWZbdV0rdmFsW3ZdOwogICAgICAgIGRmc19pbml0KHYsdSk7CiAgICB9Cn0KCmludCBsY2EoaW50IHUsaW50IHYpewogICAgaWYoZGVwdGhbdV08ZGVwdGhbdl0pIHN3YXAodSx2KTsKICAgIGludCBrPWRlcHRoW3VdLWRlcHRoW3ZdOwogICAgZm9yKGludCBqPUxPRy0xO2o+PTA7ai0tKSBpZihrPj5qJjEpIHU9dXBbdV1bal07CiAgICBpZih1PT12KSByZXR1cm4gdTsKICAgIGZvcihpbnQgaj1MT0ctMTtqPj0wO2otLSkgaWYodXBbdV1bal0hPXVwW3ZdW2pdKXsKICAgICAgICB1PXVwW3VdW2pdOyB2PXVwW3ZdW2pdOwogICAgfQogICAgcmV0dXJuIHVwW3VdWzBdOwp9Cgp2b2lkIGRmc19hbnMoaW50IHUsaW50IHApewogICAgc3RhdGljIGludCBNID0gMDsKICAgIGJpdC5hZGQoKGludClmW3VdLDEpOwogICAgZm9yKGF1dG8gW2lkLCBpZHhOZWVkLCBzaWduXSA6IGd1W3VdKXsKICAgICAgICBhbnNbaWRdICs9IDFMTCpzaWduKihiaXQuc3VtKE0pIC0gYml0LnN1bShpZHhOZWVkKSk7CiAgICB9CiAgICBmb3IoaW50IHY6Z1t1XSkgaWYodiE9cCkgZGZzX2Fucyh2LHUpOwogICAgYml0LmFkZCgoaW50KWZbdV0sLTEpOwp9CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4+Pm4+PnE7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgY2luPj52YWxbaV07CiAgICBmb3IoaW50IGk9MTtpPG47aSsrKXsKICAgICAgICBpbnQgdSx2OyBjaW4+PnU+PnY7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2sodSk7CiAgICB9CgogICAgZlsxXT12YWxbMV07CiAgICBkZnNfaW5pdCgxLDApOwoKICAgIHZlY3Rvcjxsb25nIGxvbmc+IHZhbHM7CiAgICB2YWxzLnJlc2VydmUobitxKTsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSB2YWxzLnB1c2hfYmFjayhmW2ldKTsKCiAgICBmb3IoaW50IGk9MTtpPD1xO2krKyl7CiAgICAgICAgaW50IHUsdjsgY2luPj51Pj52OwogICAgICAgIGludCB3PWxjYSh1LHYpOwogICAgICAgIFVbaV09dTsgVltpXT12OyBXW2ldPXc7CiAgICAgICAgbmVlZHZbaV09Zlt1XStmW3ZdLTIqZlt3XSt2YWxbd107CiAgICAgICAgdmFscy5wdXNoX2JhY2sobmVlZHZbaV0pOwogICAgfQoKICAgIHNvcnQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKTsKICAgIHZhbHMuZXJhc2UodW5pcXVlKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSksIHZhbHMuZW5kKCkpOwoKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKXsKICAgICAgICBmW2ldID0gbG93ZXJfYm91bmQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpLCBmW2ldKSAtIHZhbHMuYmVnaW4oKSArIDE7CiAgICB9CgogICAgdmVjdG9yPGludD4gaWR4TmVlZChxKzEpOwogICAgZm9yKGludCBpPTE7aTw9cTtpKyspewogICAgICAgIGlkeE5lZWRbaV0gPSB1cHBlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIG5lZWR2W2ldKSAtIHZhbHMuYmVnaW4oKTsKICAgICAgICBndVtVW2ldXS5wdXNoX2JhY2soe2ksIGlkeE5lZWRbaV0sICsxfSk7CiAgICAgICAgZ3VbVltpXV0ucHVzaF9iYWNrKHtpLCBpZHhOZWVkW2ldLCArMX0pOwogICAgICAgIGd1W1dbaV1dLnB1c2hfYmFjayh7aSwgaWR4TmVlZFtpXSwgLTJ9KTsKICAgICAgICBpZigobG9uZyBsb25nKShsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIGZbV1tpXV0pIC0gdmFscy5iZWdpbigpICsgMSkgPiBpZHhOZWVkW2ldKSBhbnNbaV0rKzsKICAgIH0KCiAgICBiaXQuaW5pdCgoaW50KXZhbHMuc2l6ZSgpKTsKICAgIGRmc19hbnMoMSwwKTsKCiAgICBmb3IoaW50IGk9MTtpPD1xO2krKykgY291dDw8YW5zW2ldPDwiXG4iOwogICAgcmV0dXJuIDA7Cn0K