#include #include #include #include #include #include #include #include using namespace std; void solve() { int n, k; cin >> n >> k; vector v(n); for(auto& x: v) cin >> x; vector> edges(n); for(int i = 0; i < n; i++) { int a, b; cin >> a >> b; a--; b--; edges[a].push_back(b); edges[b].push_back(a); } vector id(n, -1); int numtrees = 0; { vector st; vector dp(n); bool done = false; auto dfs = [&](auto&& dfs, int curr, int par) -> void { if(done) return; if(dp[curr] == 1) { int nv = 0; for(int i = st.size()-1; i >= 0; i--) { id[st[i]] = nv++; if(st[i] == curr) break; } numtrees = nv; done = true; return; } dp[curr] = 1; st.push_back(curr); for(int out: edges[curr]) { if(out == par) continue; dfs(dfs, out, curr); } st.pop_back(); dp[curr] = 2; }; dfs(dfs, 0, -1); assert(done); } { queue q; for(int i = 0; i < n; i++) { if(id[i] >= 0) q.push(i); } while(q.size()) { int curr = q.front(); q.pop(); for(int out: edges[curr]) if(id[out] == -1) { q.push(out); id[out] = id[curr]; } } } map freq; vector> treefreq(numtrees); for(int i = 0; i < n; i++) { freq[v[i]]++; treefreq[id[i]][v[i]]++; } int64_t ret = 0; for(int i = 0; i < n; i++) { ret += 2 * freq[v[i] + k]; ret -= treefreq[id[i]][v[i] + k]; } cout << ret << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); solve(); }