#pragma GCC optimize("Ofast") #pragma GCC optimize("avx2") #pragma GCC optimize("unroll-loops") #include using namespace std; long long n,c[100001],mi=LONG_MAX,ma=-1,bl[100001][21],lvl[100001],td,f; vector v[100001]; map > m; map >::iterator it; void dfs(int k,int p){ lvl[k]=lvl[p]+1; bl[k][0]=p; for(int ch:v[k]){ if(ch!=p) dfs(ch,k); } } void dfs1(int k, int p, long long d){ if(d>0 && c[k]==it->first){ ma=max(ma,d); mi=min(mi,d); } for(int ch:v[k]){ if(ch!=p) dfs1(ch,k,d+1); } } int lca(int a, int b){ if(lvl[a]=0;i--) if(lvl[bl[a][i]]>=lvl[b]) a=bl[a][i]; if(a==b) return a; for(int i=20;i>=0;i--) if(lvl[bl[a][i]]!=lvl[bl[b][i]]){a=bl[a][i]; b=bl[b][i];} return bl[a][0]; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); freopen("colors.in","r",stdin); freopen("colors.out","w",stdout); int i,p,q,j,a,b; cin>>n; for(i=1;i>p>>q; v[p].push_back(q); v[q].push_back(p); } for(i=1;i<=n;i++){ cin>>c[i]; m[c[i]].push_back(i); } dfs(1,0); for(i=1;i<21;i++){ for(j=1;j<=n;j++) bl[j][i]=bl[bl[j][i-1]][i-1]; } for(it=m.begin();it!=m.end();it++){ if(it->second.size()>1){ if(it->second.size()*it->second.size()>n) dfs1(it->second[0],0,0); else for(i=0;isecond.size()-1;i++){ for(j=i+1;jsecond.size();j++){ a=it->second[i]; b=it->second[j]; td=lvl[a]+lvl[b]-2*lvl[lca(a,b)]; ma=max(ma,td); mi=min(mi,td); } } } } if(ma==-1) cout<<-1<<" "<<-1; else cout<