#include using namespace std; int merge(int a,int b){return max(a,b);} int apply(int a){return a+1;} int e(){return 0;} template struct ReRooting{ vector> g; vector> dp; vector ans; ReRooting(int n):g(n),dp(n),ans(n){} void add_edge(int v,int u){ g[v].push_back(u); g[u].push_back(v); } void build(){ dfs(0); dfs2(0); } T dfs(int v,int p=-1){ dp[v].resize(g[v].size()); T ret=e(); for (int i=0;i dpr(g[v].size()+1); dpr[g[v].size()]=e(); for (int i=g[v].size()-1;i>=0;i--){ int u=g[v][i]; if (u==p) dp[v][i]=dp_p; dpr[i]=merge(dpr[i+1],dp[v][i]); } T dpl=e(); for (int i=0;i>n; ReRooting g(n); for (int i=0;i>u>>v; u--;v--; g.add_edge(u,v); } g.build(); int ans=0; for (int i=0;i