#include #include #include #include #include #include #include using namespace std; std::pair _max(std::pair a,std::pair b){ return a > b ? a : b; } std::pair _e(){ return std::make_pair(-1,-1); } class ContinuousPriorityQueue{ private: std::vector> _vec; atcoder::segtree,_max,_e> _seg; // val,index public: ContinuousPriorityQueue(int maxsize=200000){ _seg=atcoder::segtree,_max,_e>(maxsize); _vec.reserve(maxsize); } int top(int l,int r){ assert(0<=l && l<_vec.size() && 0<=r && r<=_vec.size()); return _seg.prod(l,r).first; } int pop(int l,int r){ assert(0<=l && l<_vec.size() && 0 max_p=_seg.prod(l,r); if(max_p==_e()){ return -1; } int res=max_p.first; _vec[max_p.second].pop(); if(_vec[max_p.second].empty()){ _seg.set(max_p.second,_e()); }else{ _seg.set(max_p.second,std::make_pair(_vec[max_p.second].top(),max_p.second)); } return res; } void add(int index,int val){ assert(0<=index && index<_vec.size()); _vec[index].push(val); _seg.set(index,std::make_pair(_vec[index].top(),index)); return; } void add_back(int val){ assert(!_vec.empty()); _vec.back().push(val); _seg.set(_vec.size()-1,std::make_pair(_vec.back().top(),_vec.size()-1)); return; } void push_back(){ _vec.push_back(std::priority_queue()); return; } int size(){ return _vec.size(); } bool empty(int index){ return _vec[index].empty(); } void _print(){ for(int i=0;i<_vec.size();i++){ priority_queue pq=_vec[i]; while(!pq.empty()){ cout<> G; ContinuousPriorityQueue CPQ; vector depth; vector parent; vector> children; void dfs(int point,int dep){ depth[point]=dep; for(int to:G[point]){ if(depth[to]==-1){ dfs(to,dep+1); children[point].push_back(to); }else{ parent[point]=to; } } return; } int dfs2(int point){ vector pq; int pre=CPQ.size(); for(int to:children[point]){ int tmp=dfs2(to); pq.push_back(tmp); } int res=1; //cerr<<"point:"<>N; G.resize(N); depth.resize(N,-1); parent.resize(N,-1); children.resize(N); for(int i=0;i>A>>B; G[A-1].push_back(B-1); G[B-1].push_back(A-1); } dfs(0,0); int ans=dfs2(0); cout<