#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;
}