题目
#include<bits/stdc++.h>
#define rep(fro,ton) for(int i = fro; i <= ton; ++i)
#define Rep(fro,ton) for(int j = fro; j < ton; ++j)
#define ll long long
#define ull unsigned long long
#define zhangqixuan return
#define code 0
#define N 100001
using namespace std;
int n, S;
struct edge {
int to, dis, next;
} e[2 * N];
int head[N], cnt=0;
void add_edge(int u, int v, int d) {
e[++cnt].dis = d;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
int ans;
int a[N], s[N], st[N];
void dfs(int u, int fa) {
s[u] = s[fa] + a[u];
st[s[u]]++;
if(s[u] - S >= 0)ans += st[s[u] - S];
for (int i = head[u]; i; i = e[i].next)
if (e[i].to != fa)
dfs(e[i].to, u);
st[s[u]]--;
}
int main() {
cin >> n >> S;
rep(1, n) cin >> a[i];
Rep(1, n) {
int x, y;
cin >> x >> y;
add_edge(x,y,1);
}
st[0] = 1;
dfs(1, 0);
cout << ans << endl;
return 0;
}