#include using namespace std; template class Cumulative{ //1次元. private: T op(T a,T b){return max(a,b);} T inv(T a){return -a;} //ない場合はスルー->rangeans使用不可. T e(){return 0;} int n; vector L,R; public: Cumulative(){} Cumulative(vector &A){make(A);} void make(vector &A){ L = A,R = A; n = A.size(); for(int i=1; i=0; i--) R.at(i) = op(R.at(i),R.at(i+1)); } T rangeans(int l,int r){ //[l,r]だよL<0も許容 逆元はいる. if(l > r || r < 0) return e(); T ret = L.at(r); if(l > 0) ret = op(ret,inv(L.at(l-1))); return ret; } T skipone(int pos){ //0<=pos 0) ret = L.at(pos-1); if(pos != n-1) ret = op(ret,R.at(pos+1)); return ret; } T skiprange(int l,int r){//l<=r. T ret = e(); if(l > 0) ret = L.at(l-1); if(r != n-1) ret = op(ret,R.at(r+1)); return ret; } T get(int pos){return L.at(pos);} vector allA(){return L;} }; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector> Graph(N); for(int i=0; i> u >> v; u--; v--; Graph.at(u).push_back(v); Graph.at(v).push_back(u); } vector par(N,-1); vector> kid(N); { auto dfs = [&](auto dfs,int pos,int back) -> int { int ret = 0; for(int i=0; i void { if(back != -1) kid.at(pos).at(par.at(pos)) = take; auto S = kid.at(pos); sort(S.rbegin(),S.rend()); for(int i=0; i