#include<bits/stdc++.h>
using namespace std;
using ll=long long;
struct UF{
UF* root;
ll rank=0;
ll cnt=1;
};
UF* Root(UF* a){
if(a->root!=a){
a->root=Root(a->root);
}
return a->root;
};
void merge(UF* rx,UF* ry){
if(rx==ry)return;
if(rx->rank<ry->rank){
rx->root=ry;
ry->cnt+=rx->cnt;
}else{
ry->root=rx;
rx->cnt+=ry->cnt;
if(rx->rank==ry->rank){
rx->rank++;
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll n,a,b;
cin>>n>>a>>b;
ll sum=n*(n+1)/2;
vector<ll>w(n+1);
vector<UF>nodeA(n+1);
vector<UF>nodeB(n+1);
vector<UF>nodeAB(n+1);
for(ll i=1;i<=n;i++){
cin>>w[i];
nodeA[i].root=&nodeA[i];
nodeB[i].root=&nodeB[i];
nodeAB[i].root=&nodeAB[i];
}
for(ll i=1;i<=n-1;i++){
ll u,v;
cin>>u>>v;
if(w[u]>a&&w[v]>a){
merge(Root(&nodeA[u]),Root(&nodeA[v]));
}
if(w[u]<b&&w[v]<b){
merge(Root(&nodeB[u]),Root(&nodeB[v]));
}
if(w[u]<b&&w[u]>a&&w[v]<b&&w[v]>a){
merge(Root(&nodeAB[u]),Root(&nodeAB[v]));
}
}
ll sum_A=0,sum_B=0,sum_AB=0;
unordered_set<UF*>sA;
unordered_set<UF*>sB;
unordered_set<UF*>sAB;
for(ll i=1;i<=n;i++){
if(sA.find(Root(&nodeA[i]))==sA.end()){
ll t=Root(&nodeA[i])->cnt;
sum_A+=t*(t+1)/2;
sA.insert(Root(&nodeA[i]));
}
if(sB.find(Root(&nodeB[i]))==sB.end()){
ll t=Root(&nodeB[i])->cnt;
sum_B+=t*(t+1)/2;
sB.insert(Root(&nodeB[i]));
}
if(sAB.find(Root(&nodeAB[i]))==sAB.end()){
ll t=Root(&nodeAB[i])->cnt;
sum_AB+=t*(t+1)/2;
sAB.insert(Root(&nodeAB[i]));
}
}
cout<<sum-sum_A-sum_B+sum_AB;
return 0;
}