#include #include using namespace std; #define NMAX 100005 #define pb push_back int h[NMAX],st[NMAX],dr[NMAX]; char viz[NMAX]; int rmq[20][NMAX],n,m,nr; int prep[NMAX],nrb,centru; vector v[NMAX]; inline void dfs(int nod) { viz[nod] = 1; st[nod] = ++nr; int i, vec, lim = v[nod].size(); for(i = 0; i < lim; i++) if(!viz[vec = v[nod][i]]) { h[vec] = h[nod] + 1; rmq[0][vec] = nod; dfs(vec); } dr[nod] = nr; } int find(int nod,int L) { if(!L) return nod; return find(rmq[prep[L]][nod], L - (1 << prep[L])); } int lca(int n1,int n2) { int i,aux; if(h[n1] >= h[n2]) { aux = n1; n1 = n2; n2 = aux; } n2 = find(n2, h[n2] - h[n1]); if(n1 == n2) return n1; for(i = nrb; i >= 0; i--) if(rmq[i][n1] != rmq[i][n2]) { n1 = rmq[i][n1]; n2 = rmq[i][n2]; } return rmq[0][n1]; } int main () { int i,j,a,b,sef1,sef2,sef3,tip,sef; // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); scanf("%d%d",&n,&m); for(i = 1; i < n; i++) { scanf("%d%d",&a,&b); v[a].pb(b); v[b].pb(a); } dfs(1); for(i = 2; i <= n; i++) prep[i] = prep[i / 2] + 1; nrb = prep[n]; for(j = 1; (1<= (1<