#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
int n,m,s;
vector<int>komsu[200023];
int arr[200023];
vector<int>dia;
int root[200023],par[200023];
int dep[200023],h[200023],h2[200023];
int uniq[200023];
int fir[200023];
vector<int>v;
int ans[200023];
void dfs(int pos,int k){
int k2=k;
int l=0,r=k;
while(l<r){
int mi=(l+r)/2;
if(root[v[mi]])l=mi+1;
else if(dep[v[mi]]>=dep[pos]-h2[pos])r=mi;
else l=mi+1;
}
k2=l;
pair<int,int> old={-1,1e9};
if(fir[arr[pos]]>=k2){
old.sc=fir[arr[pos]];
fir[arr[pos]]=k2;
if(k2==v.size()){
old.fr=-2;
v.pb(pos);
k2++;
}
else{
old.fr=v[k2];
v[k2++]=pos;
}
}
int y=-1;
for(int x:komsu[pos]){
if(x==par[pos])continue;
if(root[x])continue;
if(h[x]==h[pos]-1){
y=x;
dfs(y,k2);
break;
}
}
if(old.fr!=-1){
fir[arr[pos]]=old.sc;
if(old.fr==-2){
v.pop_back();
}
else{
v[--k2]=old.fr;
}
}
old={-1,1e9};
l=0;r=k;
while(l<r){
int mi=(l+r)/2;
if(root[v[mi]])l=mi+1;
else if(dep[v[mi]]>=dep[pos]-h[pos])r=mi;
else l=mi+1;
}
k2=l;
ans[pos]=k2;
if(fir[arr[pos]]>=k2){
old.sc=fir[arr[pos]];
fir[arr[pos]]=k2;
if(k2==v.size()){
old.fr=-2;
v.pb(pos);
k2++;
}
else{
old.fr=v[k2];
v[k2++]=pos;
}
}
for(int x:komsu[pos]){
if(x==par[pos])continue;
if(root[x])continue;
if(x==y)continue;
dfs(x,k2);
}
if(old.fr!=-1){
fir[arr[pos]]=old.sc;
if(old.fr==-2){
v.pop_back();
}
else{
v[--k2]=old.fr;
}
}
}
int main(){
ios_base::sync_with_stdio(23^23);cin.tie(NULL);
cin>>n>>m;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
komsu[x].pb(y);
komsu[y].pb(x);
}
for(int i=1;i<=n;i++){
cin>>arr[i];
}
{
int a=1;
queue<int>q;
q.push(1);
while(q.size()){
int pos=q.front();
q.pop();
a=pos;
for(int x:komsu[pos]){
if(x==par[pos])continue;
par[x]=pos;
q.push(x);
}
}
int b=a;
q.push(a);
par[a]=a;
while(q.size()){
int pos=q.front();
q.pop();
b=pos;
for(int x:komsu[pos]){
if(x==par[pos])continue;
dep[x]=dep[pos]+1;
par[x]=pos;
q.push(x);
}
}
while(b!=a){
dia.pb(b);
root[b]=1;
b=par[b];
}
dia.pb(a);
root[a]=1;
reverse(dia.begin(),dia.end());
}
s=dia.size();
{
function<void(int)>find_h=[&](int pos)->void{
h[pos]=0;
h2[pos]=0;
for(int x:komsu[pos]){
if(x==par[pos])continue;
if(root[x])continue;
find_h(x);
if(h[x]+1>h[pos]){
h2[pos]=h[pos];
h[pos]=h[x]+1;
}
else if(h[x]+1>h2[pos]){
h2[pos]=h[x]+1;
}
}
};
for(int x:dia){
find_h(x);
}
}
{
int mx=-1;
for(int i=0;i<s;i++){
if(mx<i){
uniq[dia[i]]=1;
}
mx=max(mx,i+h[dia[i]]);
}
}
for(int i=1;i<=m;i++){
fir[i]=1e9;
}
int p=s-1;
for(int o=s-1;o>=0;o--){
if(o*2>=s)continue;
int bas=dia[o];
while(o<p-o){
if(uniq[dia[p]]){
if(fir[arr[dia[p]]]==1e9){
fir[arr[dia[p]]]=v.size();
v.pb(dia[p]);
}
}
p--;
}
root[bas]=0;
dfs(bas,v.size());
root[bas]=1;
}
v.clear();
for(int i=1;i<=m;i++){
fir[i]=1e9;
}
{
for(int i=1;i<=n;i++){
uniq[i]=0;
}
int mn=s;
for(int i=s-1;i>=0;i--){
if(mn>i){
uniq[dia[i]]=1;
}
mn=min(mn,i-h[dia[i]]);
}
}
p=0;
for(int o=0;o<s;o++){
if(o*2<s)continue;
int bas=dia[o];
while(s-1-o<o-p){
if(uniq[dia[p]]){
if(fir[arr[dia[p]]]==1e9){
fir[arr[dia[p]]]=v.size();
v.pb(dia[p]);
}
}
p++;
}
root[bas]=0;
dfs(bas,v.size());
root[bas]=1;
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<endl;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |