LCA
트리의 최소 공통 조상
int N, Q, D[101010], P[22][101010];
vector<int> G[101010];
void Connect(int u, int v){
G[u].push_back(v); G[v].push_back(u);
}
void DFS(int v, int b=-1){
for(auto i : G[v]) if(i != b) D[i] = D[v] + 1, P[0][i] = v, DFS(i, v);
}
int LCA(int u, int v){
if(D[u] < D[v]) swap(u, v);
int diff = D[u] - D[v];
for(int i=0; diff; i++, diff>>=1) if(diff & 1) u = P[i][u];
if(u == v) return u;
for(int i=21; i>=0; i--) if(P[i][u] != P[i][v]) u = P[i][u], v = P[i][v];
return P[0][u];
}
////
// 1. Connect로 간선 추가
// 2. DFS(1) 호출
// 3. 아래 코드 실행
for(int i=1; i<22; i++) for(int j=1; j<=N; j++) P[i][j] = P[i-1][P[i-1][j]];
// 4. LCA(u, v)로 최소 공통 조상 구할 수 있음