void DFS(int u,int fa,int root,int typ) {
color[c[u]] += typ;
if(color[c[u]] > Max) {
Max = color[c[u]];
Sum = c[u];
}
else if(color[c[u]] == Max) Sum += c[u];
for(int i = 0;i < V[u].size();i ++) {
int v = V[u][i];
if(v == fa || v == son[root]) continue;
DFS(v,u,root,typ);
}
}
void dfs(int u,int fa,int opt) {
for(int i = 0;i < V[u].size();i ++) {
int v = V[u][i];
if(v == fa || v == son[u]) continue;
dfs(v,u,0);
}
if(son[u]) dfs(son[u],u,1);
DFS(u,fa,u,1); ans[u] = Sum * Max;
if(!opt) DFS(u,fa,u,-1),Max = Sum = 0;
}