#include <bits/stdc++.h>
using namespace std;
struct Seg {
int n;
struct Node { int mn, lz; } ;
vector<Node> st;
Seg(int n=0): n(n), st(4*n+5,{0,0}) {}
void build(int p, int l, int r, const vector<int>& base){
if(l==r){ st[p].mn = base[l]; return; }
int m=(l+r)>>1;
build(p<<1,l,m,base); build(p<<1|1,m+1,r,base);
st[p].mn = min(st[p<<1].mn, st[p<<1|1].mn);
}
void push(int p){
if(st[p].lz){
int v=st[p].lz;
st[p<<1].mn += v; st[p<<1].lz += v;
st[p<<1|1].mn += v; st[p<<1|1].lz += v;
st[p].lz=0;
}
}
void range_add(int p, int l, int r, int ql, int qr, int v){
if(ql>r || qr<l) return;
if(ql<=l && r<=qr){ st[p].mn += v; st[p].lz += v; return; }
push(p);
int m=(l+r)>>1;
range_add(p<<1,l,m,ql,qr,v);
range_add(p<<1|1,m+1,r,ql,qr,v);
st[p].mn = min(st[p<<1].mn, st[p<<1|1].mn);
}
void point_add(int p, int l, int r, int idx, int v){
if(l==r){ st[p].mn += v; return; }
push(p);
int m=(l+r)>>1;
if(idx<=m) point_add(p<<1,l,m,idx,v);
else point_add(p<<1|1,m+1,r,idx,v);
st[p].mn = min(st[p<<1].mn, st[p<<1|1].mn);
}
int get_min(){ return st[1].mn; }
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
if(!(cin>>n>>m)) return 0;
vector<int> v(n+1);
for(int i=1;i<=n;i++) cin>>v[i];
vector<vector<int>> g(n+1);
for(int i=0;i<n-1;i++){
int a,b; cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
vector<int> tin(n+1), tout(n+1), depth(n+1), order(n+1), par(n+1,-1);
int timer=0;
function<void(int,int)> dfs = [&](int u,int p){
par[u]=p;
tin[u]=++timer; order[timer]=u;
for(int w: g[u]) if(w!=p){
depth[w]=depth[u]+1;
dfs(w,u);
}
tout[u]=timer;
};
dfs(1,0);
const int INF = 1e9;
vector<int> base(timer+1, INF);
Seg seg(timer);
seg.build(1,1,timer,base);
vector<int> mask(timer+1, INF);
auto activate = [&](int u){
int pos=tin[u];
int newMask = -(depth[u]+1);
seg.point_add(1,1,timer,pos,newMask - mask[pos]);
mask[pos]=newMask;
seg.range_add(1,1,timer,tin[u],tout[u],+1);
};
auto deactivate = [&](int u){
int pos=tin[u];
int newMask = INF;
seg.point_add(1,1,timer,pos,newMask - mask[pos]);
mask[pos]=newMask;
seg.range_add(1,1,timer,tin[u],tout[u],-1);
};
vector<vector<int>> byVal(m+2);
for(int i=1;i<=n;i++) byVal[v[i]].push_back(i);
vector<int> occ(m+2,0);
int distinct=0, dup=0, activeCnt=0;
auto addVal = [&](int x){
for(int u: byVal[x]){ activate(u); activeCnt++; }
occ[x] += (int)byVal[x].size();
if(occ[x]>0 && occ[x]-(int)byVal[x].size()==0) distinct++;
if(occ[x]>=2) dup++;
};
auto removeVal = [&](int x){
if(occ[x]>=2) dup--;
if(occ[x]>0 && occ[x]-(int)byVal[x].size()==0) distinct--;
for(int u: byVal[x]){ deactivate(u); activeCnt--; }
occ[x] -= (int)byVal[x].size();
};
int ans=0;
int L=1;
for(int R=1; R<=m; R++){
addVal(R);
while(L<=R){
bool ok_gap = (distinct == R-L+1);
bool ok_dup = (dup==0);
bool ok_tree = (activeCnt==0) || (seg.get_min()==0);
if(ok_gap && ok_dup && ok_tree){
ans = max(ans, activeCnt);
break;
}else{
removeVal(L);
L++;
}
}
if(L>R){ L=R+1; }
}
cout<<ans<<"\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgU2VnIHsKICAgIGludCBuOwogICAgc3RydWN0IE5vZGUgeyBpbnQgbW4sIGx6OyB9IDsKICAgIHZlY3RvcjxOb2RlPiBzdDsKICAgIFNlZyhpbnQgbj0wKTogbihuKSwgc3QoNCpuKzUsezAsMH0pIHt9CiAgICB2b2lkIGJ1aWxkKGludCBwLCBpbnQgbCwgaW50IHIsIGNvbnN0IHZlY3RvcjxpbnQ+JiBiYXNlKXsKICAgICAgICBpZihsPT1yKXsgc3RbcF0ubW4gPSBiYXNlW2xdOyByZXR1cm47IH0KICAgICAgICBpbnQgbT0obCtyKT4+MTsKICAgICAgICBidWlsZChwPDwxLGwsbSxiYXNlKTsgYnVpbGQocDw8MXwxLG0rMSxyLGJhc2UpOwogICAgICAgIHN0W3BdLm1uID0gbWluKHN0W3A8PDFdLm1uLCBzdFtwPDwxfDFdLm1uKTsKICAgIH0KICAgIHZvaWQgcHVzaChpbnQgcCl7CiAgICAgICAgaWYoc3RbcF0ubHopewogICAgICAgICAgICBpbnQgdj1zdFtwXS5sejsKICAgICAgICAgICAgc3RbcDw8MV0ubW4gKz0gdjsgc3RbcDw8MV0ubHogKz0gdjsKICAgICAgICAgICAgc3RbcDw8MXwxXS5tbiArPSB2OyBzdFtwPDwxfDFdLmx6ICs9IHY7CiAgICAgICAgICAgIHN0W3BdLmx6PTA7CiAgICAgICAgfQogICAgfQogICAgdm9pZCByYW5nZV9hZGQoaW50IHAsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIsIGludCB2KXsKICAgICAgICBpZihxbD5yIHx8IHFyPGwpIHJldHVybjsKICAgICAgICBpZihxbDw9bCAmJiByPD1xcil7IHN0W3BdLm1uICs9IHY7IHN0W3BdLmx6ICs9IHY7IHJldHVybjsgfQogICAgICAgIHB1c2gocCk7CiAgICAgICAgaW50IG09KGwrcik+PjE7CiAgICAgICAgcmFuZ2VfYWRkKHA8PDEsbCxtLHFsLHFyLHYpOwogICAgICAgIHJhbmdlX2FkZChwPDwxfDEsbSsxLHIscWwscXIsdik7CiAgICAgICAgc3RbcF0ubW4gPSBtaW4oc3RbcDw8MV0ubW4sIHN0W3A8PDF8MV0ubW4pOwogICAgfQogICAgdm9pZCBwb2ludF9hZGQoaW50IHAsIGludCBsLCBpbnQgciwgaW50IGlkeCwgaW50IHYpewogICAgICAgIGlmKGw9PXIpeyBzdFtwXS5tbiArPSB2OyByZXR1cm47IH0KICAgICAgICBwdXNoKHApOwogICAgICAgIGludCBtPShsK3IpPj4xOwogICAgICAgIGlmKGlkeDw9bSkgcG9pbnRfYWRkKHA8PDEsbCxtLGlkeCx2KTsKICAgICAgICBlbHNlIHBvaW50X2FkZChwPDwxfDEsbSsxLHIsaWR4LHYpOwogICAgICAgIHN0W3BdLm1uID0gbWluKHN0W3A8PDFdLm1uLCBzdFtwPDwxfDFdLm1uKTsKICAgIH0KICAgIGludCBnZXRfbWluKCl7IHJldHVybiBzdFsxXS5tbjsgfQp9OwoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBpbnQgbixtOwogICAgaWYoIShjaW4+Pm4+Pm0pKSByZXR1cm4gMDsKICAgIHZlY3RvcjxpbnQ+IHYobisxKTsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSBjaW4+PnZbaV07CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGcobisxKTsKICAgIGZvcihpbnQgaT0wO2k8bi0xO2krKyl7CiAgICAgICAgaW50IGEsYjsgY2luPj5hPj5iOwogICAgICAgIGdbYV0ucHVzaF9iYWNrKGIpOwogICAgICAgIGdbYl0ucHVzaF9iYWNrKGEpOwogICAgfQogICAgdmVjdG9yPGludD4gdGluKG4rMSksIHRvdXQobisxKSwgZGVwdGgobisxKSwgb3JkZXIobisxKSwgcGFyKG4rMSwtMSk7CiAgICBpbnQgdGltZXI9MDsKICAgIGZ1bmN0aW9uPHZvaWQoaW50LGludCk+IGRmcyA9IFsmXShpbnQgdSxpbnQgcCl7CiAgICAgICAgcGFyW3VdPXA7CiAgICAgICAgdGluW3VdPSsrdGltZXI7IG9yZGVyW3RpbWVyXT11OwogICAgICAgIGZvcihpbnQgdzogZ1t1XSkgaWYodyE9cCl7CiAgICAgICAgICAgIGRlcHRoW3ddPWRlcHRoW3VdKzE7CiAgICAgICAgICAgIGRmcyh3LHUpOwogICAgICAgIH0KICAgICAgICB0b3V0W3VdPXRpbWVyOwogICAgfTsKICAgIGRmcygxLDApOwogICAgY29uc3QgaW50IElORiA9IDFlOTsKICAgIHZlY3RvcjxpbnQ+IGJhc2UodGltZXIrMSwgSU5GKTsKICAgIFNlZyBzZWcodGltZXIpOwogICAgc2VnLmJ1aWxkKDEsMSx0aW1lcixiYXNlKTsKICAgIHZlY3RvcjxpbnQ+IG1hc2sodGltZXIrMSwgSU5GKTsKICAgIGF1dG8gYWN0aXZhdGUgPSBbJl0oaW50IHUpewogICAgICAgIGludCBwb3M9dGluW3VdOwogICAgICAgIGludCBuZXdNYXNrID0gLShkZXB0aFt1XSsxKTsKICAgICAgICBzZWcucG9pbnRfYWRkKDEsMSx0aW1lcixwb3MsbmV3TWFzayAtIG1hc2tbcG9zXSk7CiAgICAgICAgbWFza1twb3NdPW5ld01hc2s7CiAgICAgICAgc2VnLnJhbmdlX2FkZCgxLDEsdGltZXIsdGluW3VdLHRvdXRbdV0sKzEpOwogICAgfTsKICAgIGF1dG8gZGVhY3RpdmF0ZSA9IFsmXShpbnQgdSl7CiAgICAgICAgaW50IHBvcz10aW5bdV07CiAgICAgICAgaW50IG5ld01hc2sgPSBJTkY7CiAgICAgICAgc2VnLnBvaW50X2FkZCgxLDEsdGltZXIscG9zLG5ld01hc2sgLSBtYXNrW3Bvc10pOwogICAgICAgIG1hc2tbcG9zXT1uZXdNYXNrOwogICAgICAgIHNlZy5yYW5nZV9hZGQoMSwxLHRpbWVyLHRpblt1XSx0b3V0W3VdLC0xKTsKICAgIH07CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGJ5VmFsKG0rMik7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgYnlWYWxbdltpXV0ucHVzaF9iYWNrKGkpOwogICAgdmVjdG9yPGludD4gb2NjKG0rMiwwKTsKICAgIGludCBkaXN0aW5jdD0wLCBkdXA9MCwgYWN0aXZlQ250PTA7CiAgICBhdXRvIGFkZFZhbCA9IFsmXShpbnQgeCl7CiAgICAgICAgZm9yKGludCB1OiBieVZhbFt4XSl7IGFjdGl2YXRlKHUpOyBhY3RpdmVDbnQrKzsgfQogICAgICAgIG9jY1t4XSArPSAoaW50KWJ5VmFsW3hdLnNpemUoKTsKICAgICAgICBpZihvY2NbeF0+MCAmJiBvY2NbeF0tKGludClieVZhbFt4XS5zaXplKCk9PTApIGRpc3RpbmN0Kys7CiAgICAgICAgaWYob2NjW3hdPj0yKSBkdXArKzsKICAgIH07CiAgICBhdXRvIHJlbW92ZVZhbCA9IFsmXShpbnQgeCl7CiAgICAgICAgaWYob2NjW3hdPj0yKSBkdXAtLTsKICAgICAgICBpZihvY2NbeF0+MCAmJiBvY2NbeF0tKGludClieVZhbFt4XS5zaXplKCk9PTApIGRpc3RpbmN0LS07CiAgICAgICAgZm9yKGludCB1OiBieVZhbFt4XSl7IGRlYWN0aXZhdGUodSk7IGFjdGl2ZUNudC0tOyB9CiAgICAgICAgb2NjW3hdIC09IChpbnQpYnlWYWxbeF0uc2l6ZSgpOwogICAgfTsKICAgIGludCBhbnM9MDsKICAgIGludCBMPTE7CiAgICBmb3IoaW50IFI9MTsgUjw9bTsgUisrKXsKICAgICAgICBhZGRWYWwoUik7CiAgICAgICAgd2hpbGUoTDw9Uil7CiAgICAgICAgICAgIGJvb2wgb2tfZ2FwID0gKGRpc3RpbmN0ID09IFItTCsxKTsKICAgICAgICAgICAgYm9vbCBva19kdXAgPSAoZHVwPT0wKTsKICAgICAgICAgICAgYm9vbCBva190cmVlID0gKGFjdGl2ZUNudD09MCkgfHwgKHNlZy5nZXRfbWluKCk9PTApOwogICAgICAgICAgICBpZihva19nYXAgJiYgb2tfZHVwICYmIG9rX3RyZWUpewogICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucywgYWN0aXZlQ250KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHJlbW92ZVZhbChMKTsKICAgICAgICAgICAgICAgIEwrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihMPlIpeyBMPVIrMTsgfQogICAgfQogICAgY291dDw8YW5zPDwiXG4iOwogICAgcmV0dXJuIDA7Cn0K