void dfs(int u,int f){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f) continue;
dfs(v,u);
size[u]+=size[v];
}
}
void dfs(int u,int f){
int cnt=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f) continue;
dfs(v,u);
a[++cnt]=dp[v];
}
for(int i=1;i<=cnt;i++){
dp[u]=calc(dp[u],a[i]);
}
}
void dfs(int u,int f){
int cnt=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f) continue;
dfs(v,u);
a[++cnt]=dp[v];
}
sort(a+1,a+cnt+1);
for(int i=1;i<=cnt;i++){
dp[u]=calc(dp[u],a[i]);
}
}