LCA(RMQ)
const lx=100004; xh=27; var L,p,nt:array[0..lx*2] of longint; lt,dfn,fr,dep:array[0..lx] of longint; f:array[0..lx*2,0..xh] of longint; vis:array[0..lx] of boolean; i,x,y,n,sum,q:longint; procedure swap(var a,b:longint); var c:longint; begin c:=a; a:=b; b:=c; end; procedure dfs(u:longint); var i,v:longint; begin inc(sum); dfn[u]:=sum; vis[u]:=true; inc(L[0]); L[L[0]]:=u; fr[u]:=L[0]; i:=lt[u]; while i<>0 do begin v:=p[i]; if not vis[v] then begin dep[v]:=dep[u]+1; dfs(v); inc(L[0]); L[L[0]]:=u; end; i:=nt[i]; end; end; procedure prepare; var i,j:longint; begin fillchar(fr,sizeof(fr),0); fillchar(vis,sizeof(vis),false); fillchar(L,sizeof(L),0); sum:=0; dep[1]:=1; dfs(1); for i:=1 to L[0] do f[i,0]:=L[i]; for i:=1 to xh do for j:=1 to L[0] do if j+1<<i-1<=L[0] then if dfn[f[j,i-1]]<dfn[f[j+1<<(i-1),i-1]] then f[j,i]:=f[j,i-1] else f[j,i]:=f[j+1<<(i-1),i-1]; end; procedure add(x,y:longint); begin inc(sum); p[sum]:=y; nt[sum]:=lt[x]; lt[x]:=sum; end; function find(s,t:longint):longint; var k:longint; begin s:=fr[s]; t:=fr[t]; if s>t then swap(s,t); k:=trunc(ln(t-s+1)/ln(2)); if dfn[f[s,k]]<dfn[f[t-1<<k+1,k]] then exit(f[s,k]) else exit(f[t-1<<k+1,k]); end; function dis(s,t:longint):longint; var k:longint; begin k:=find(s,t); exit(dep[t]-dep[k]+dep[s]-dep[k]); end; begin readln(n); fillchar(lt,sizeof(lt),0); sum:=0; for i:=1 to n-1 do begin readln(x,y); add(x,y); add(y,x); end; prepare; end.