TLE on test 97
#include <bits/stdc++.h>
using namespace std;
int d[1000005],sz[1000005],big[1000005],cnt[1000005],ans[1000005],n,res=0;
vector<int> nodes[1000005];
void add(int de)
{
cnt[de]++;
if(cnt[de]>cnt[res]||(cnt[de]==cnt[res]&&de<res))res=de;
return;
}
void del(int de)
{
cnt[de]--;
return;
}
void dfs2(int u,int fa,bool keep)
{
if(keep)add(d[u]);
else del(d[u]);
for(int v:nodes[u])if(v!=fa)dfs2(v,u,keep);
return;
}
void dfs1(int u,int fa)
{
for(int v:nodes[u])
{
if(v==fa||v==big[u])continue;
dfs1(v,u);
dfs2(v,u,false);
res=0;
}
if(big[u])dfs1(big[u],u);
for(int v:nodes[u])if(v!=fa&&v!=big[u])dfs2(v,u,true);
add(d[u]);
ans[u]=res-d[u];
return;
}
void dfs0(int u,int fa)
{
sz[u]=1,d[u]=d[fa]+1;
for(int v:nodes[u])if(v!=fa)dfs0(v,u);
if(sz[u]>sz[big[fa]])big[fa]=u;
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d %d",&u,&v);
nodes[u].push_back(v);
nodes[v].push_back(u);
}
dfs0(1,0);
dfs1(1,0);
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
return 0;
}