//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 70000 + 5;
const int MAXM = 2000 + 5;
int n, m, a[MAXN];
vector<int> g[MAXN];
int st[MAXN], ed[MAXN], timer_ = 0;
vector<int> occ[MAXM];
void dfs(int u){
st[u] = ++timer_;
for(int v: g[u]) dfs(v);
ed[u] = timer_;
}
inline bool in_sub(int u, int val){
const auto& cur = occ[val];
auto it = lower_bound(cur.begin(), cur.end(), st[u]);
return (it!=cur.end() && *it<=ed[u]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
if (fopen("o.inp","r")){
freopen("o.inp","r",stdin);
freopen("o.out","w",stdout);
}
cin >> n >> m;
for (int i=1;i<=n;i++) cin >> a[i];
for (int i=1;i<=n-1;i++){
int u,v; cin >> u >> v;
g[u].push_back(v);
}
dfs(1);
for (int i=1;i<=n;i++) occ[a[i]].push_back(st[i]);
for (int v=1; v<=m; v++) sort(occ[v].begin(), occ[v].end());
vector<int> present(m+2,0);
for(int v=1; v<=m; v++) present[v] = !occ[v].empty();
vector<int> next_missing(m+2, m+1);
int nxt = m+1;
for(int L=m; L>=1; --L){
if(!present[L]) nxt = L;
next_missing[L] = nxt;
}
vector<vector<pair<int,int>>> activate_at(m+2);
for (int p=1; p<=n; ++p){
for (int c: g[p]){
static vector<char> pres; pres.assign(m+2, 0);
for (int v=1; v<=m; ++v){
if (in_sub(c, v)) pres[v]=1;
}
static vector<int> next_ge; next_ge.assign(m+2, m+1);
int last = m+1;
for (int v=m; v>=1; --v){
if (pres[v]) last = v;
next_ge[v] = last;
}
for (int L=1; L<=m; ++L){
int R0 = next_ge[L];
if (R0<=m){
activate_at[R0].push_back({L, a[p]});
}
}
}
}
long long ans = 0;
for (int L=1; L<=m; ++L){
int needR = a[1];
if (needR < L) {
continue;
}
int cutR = next_missing[L]-1;
bool ok = true;
for (int R=L; R<=m && ok; ++R){
if (R > cutR) break;
for (auto [L0, ap] : activate_at[R]){
if (L0 != L) continue;
if (ap < L){ ok = false; break; }
if (ap > needR) needR = ap;
}
if (!ok) break;
if (R >= needR) ans++;
}
}
cout << ans << '\n';
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNQVhOID0gNzAwMDAgKyA1Owpjb25zdCBpbnQgTUFYTSA9IDIwMDAgKyA1OwoKaW50IG4sIG0sIGFbTUFYTl07CnZlY3RvcjxpbnQ+IGdbTUFYTl07CgppbnQgc3RbTUFYTl0sIGVkW01BWE5dLCB0aW1lcl8gPSAwOwp2ZWN0b3I8aW50PiBvY2NbTUFYTV07Cgp2b2lkIGRmcyhpbnQgdSl7CiAgICBzdFt1XSA9ICsrdGltZXJfOwogICAgZm9yKGludCB2OiBnW3VdKSBkZnModik7CiAgICBlZFt1XSA9IHRpbWVyXzsKfQoKaW5saW5lIGJvb2wgaW5fc3ViKGludCB1LCBpbnQgdmFsKXsgCiAgICBjb25zdCBhdXRvJiBjdXIgPSBvY2NbdmFsXTsKICAgIGF1dG8gaXQgPSBsb3dlcl9ib3VuZChjdXIuYmVnaW4oKSwgY3VyLmVuZCgpLCBzdFt1XSk7CiAgICByZXR1cm4gKGl0IT1jdXIuZW5kKCkgJiYgKml0PD1lZFt1XSk7Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGlmIChmb3Blbigiby5pbnAiLCJyIikpewogICAgICAgIGZyZW9wZW4oIm8uaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIm8ub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KCiAgICBjaW4gPj4gbiA+PiBtOwogICAgZm9yIChpbnQgaT0xO2k8PW47aSsrKSBjaW4gPj4gYVtpXTsKICAgIGZvciAoaW50IGk9MTtpPD1uLTE7aSsrKXsKICAgICAgICBpbnQgdSx2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHYpOwogICAgfQoKICAgIGRmcygxKTsKICAgIGZvciAoaW50IGk9MTtpPD1uO2krKykgb2NjW2FbaV1dLnB1c2hfYmFjayhzdFtpXSk7CiAgICBmb3IgKGludCB2PTE7IHY8PW07IHYrKykgc29ydChvY2Nbdl0uYmVnaW4oKSwgb2NjW3ZdLmVuZCgpKTsKICAgIHZlY3RvcjxpbnQ+IHByZXNlbnQobSsyLDApOwogICAgZm9yKGludCB2PTE7IHY8PW07IHYrKykgcHJlc2VudFt2XSA9ICFvY2Nbdl0uZW1wdHkoKTsKICAgIHZlY3RvcjxpbnQ+IG5leHRfbWlzc2luZyhtKzIsIG0rMSk7CiAgICBpbnQgbnh0ID0gbSsxOwogICAgZm9yKGludCBMPW07IEw+PTE7IC0tTCl7CiAgICAgICAgaWYoIXByZXNlbnRbTF0pIG54dCA9IEw7IAogICAgICAgIG5leHRfbWlzc2luZ1tMXSA9IG54dDsKICAgIH0KICAgIHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsaW50Pj4+IGFjdGl2YXRlX2F0KG0rMik7IAogICAgZm9yIChpbnQgcD0xOyBwPD1uOyArK3ApewogICAgICAgIGZvciAoaW50IGM6IGdbcF0pewogICAgICAgICAgICBzdGF0aWMgdmVjdG9yPGNoYXI+IHByZXM7IHByZXMuYXNzaWduKG0rMiwgMCk7CiAgICAgICAgICAgIGZvciAoaW50IHY9MTsgdjw9bTsgKyt2KXsKICAgICAgICAgICAgICAgIGlmIChpbl9zdWIoYywgdikpIHByZXNbdl09MTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgdmVjdG9yPGludD4gbmV4dF9nZTsgbmV4dF9nZS5hc3NpZ24obSsyLCBtKzEpOyAKICAgICAgICAgICAgaW50IGxhc3QgPSBtKzE7CiAgICAgICAgICAgIGZvciAoaW50IHY9bTsgdj49MTsgLS12KXsKICAgICAgICAgICAgICAgIGlmIChwcmVzW3ZdKSBsYXN0ID0gdjsKICAgICAgICAgICAgICAgIG5leHRfZ2Vbdl0gPSBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaW50IEw9MTsgTDw9bTsgKytMKXsKICAgICAgICAgICAgICAgIGludCBSMCA9IG5leHRfZ2VbTF07CiAgICAgICAgICAgICAgICBpZiAoUjA8PW0pewogICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlX2F0W1IwXS5wdXNoX2JhY2soe0wsIGFbcF19KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsb25nIGxvbmcgYW5zID0gMDsKCiAgICAKICAgIGZvciAoaW50IEw9MTsgTDw9bTsgKytMKXsKICAgICAgICBpbnQgbmVlZFIgPSBhWzFdOyAgICAgICAgICAgICAgCiAgICAgICAgaWYgKG5lZWRSIDwgTCkgeyAKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGludCBjdXRSID0gbmV4dF9taXNzaW5nW0xdLTE7ICAgCiAgICAgICAgYm9vbCBvayA9IHRydWU7CgogICAgICAgCiAgICAgICAgZm9yIChpbnQgUj1MOyBSPD1tICYmIG9rOyArK1IpewogICAgICAgICAgICBpZiAoUiA+IGN1dFIpIGJyZWFrOwoKICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChhdXRvIFtMMCwgYXBdIDogYWN0aXZhdGVfYXRbUl0pewogICAgICAgICAgICAgICAgaWYgKEwwICE9IEwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWYgKGFwIDwgTCl7IG9rID0gZmFsc2U7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBpZiAoYXAgPiBuZWVkUikgbmVlZFIgPSBhcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9rKSBicmVhazsKCiAgICAgICAgICAgIGlmIChSID49IG5lZWRSKSBhbnMrKzsKICAgICAgICB9CiAgICB9CgogICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgIHJldHVybiAwOwp9Cg==