#include<iostream> #include<vector> #include<algorithm> #include<map> #include<string> #include<cmath> #include<queue> #include<sstream> #include<iomanip> using namespace std; long long findrootparent(long long u, vector<long long>& parent) { while (parent[u] != u) { u = parent[u]; } return u; } long long calroutes(vector<pair<long long, long long>>& lines, vector<bool>& valid) { long long n = valid.size(); vector<long long> parent(n); for (long long i = 0; i < n; i++) { parent[i] = i; } vector<long long> leafnum(n, 1); //cout << "n - 1 = " << n - 1 << " lines.size() = " << lines.size() << endl; for (long long i = 0; i < n - 1; i++) { long long u = lines[i].first; long long v = lines[i].second; if (!valid[u] || !valid[v]) continue; long long rootu = findrootparent(u, parent); long long rootv = findrootparent(v, parent); if (leafnum[rootu] < leafnum[rootv]) swap(rootu, rootv); parent[rootv] = rootu; leafnum[rootu] = leafnum[rootu] + leafnum[rootv]; } map<long long, long long> recordsroots; for (long long i = 0; i < n; i++) { long long root = findrootparent(i, parent); recordsroots[root] = 1; } long long countroutes = 0; for (auto it : recordsroots) { long long numpoints = leafnum[it.first]; countroutes = countroutes + numpoints * (numpoints - 1) / 2; } return countroutes; } int main() { long long n, a, b; cin >> n >> a >> b; vector<long long> ws(n); vector<bool> validmorethana(n, false); vector<bool> validlessthanb(n, false); vector<bool> validbetweenab(n, false); for (long long i = 0; i < n; i++) { cin >> ws[i]; if (ws[i] > a) validmorethana[i] = true; if (ws[i] < b) validlessthanb[i] = true; if (ws[i] > a && ws[i] < b) validbetweenab[i] = true; } vector<pair<long long, long long>> lines(n - 1); for (long long i = 0; i < n - 1; i++) { cin >> lines[i].first >> lines[i].second; lines[i].first--; lines[i].second--; } long long routesmorethana = calroutes(lines, validmorethana); long long routeslessthanb = calroutes(lines, validlessthanb); long long routesbetweenab = calroutes(lines, validbetweenab); long long routesvalid = n * (n - 1) / 2 - (routesmorethana + routeslessthanb - routesbetweenab); cout << routesvalid << endl; return 0; }