#pragma once
#include <bits/stdc++.h>
usingnamespacestd;structLowestCommonAncestor{intN,root,K;vector<int>dist;vector<vector<int>>G,parents;voiddfs(){dist[root]=0;stack<int>st;st.push(root);while(!st.empty()){intv=st.top();st.pop();for(inte:G[v]){if(dist[e]>=0){parents[v][0]=e;continue;}dist[e]=dist[v]+1;st.push(e);}}}LowestCommonAncestor(intN,constvector<vector<int>>&G,introot=0):N(N),G(G),root(root){K=1;while((1<<K)<N)++K;dist.assign(N,-1);dist[root]=0;parents.assign(N,vector<int>(K,-1));dfs();for(inti=0;i<K-1;++i){for(intj=0;j<N;++j){if(parents[j][i]<0)continue;parents[j][i+1]=parents[parents[j][i]][i];}}}intquery(intu,intv){if(dist[u]<dist[v])swap(u,v);for(intk=0;k<K;++k){if(((dist[u]-dist[v])>>k)&1)u=parents[u][k];}if(u==v)returnu;for(intk=K-1;k>=0;--k){if(parents[u][k]!=parents[v][k]){u=parents[u][k];v=parents[v][k];}}returnparents[u][0];}intoperator[](intk){returndist[k];}};