#define rep(i, n) for (int i = 0; i < (int)(n); i++) #define ALL(v) v.begin(), v.end() typedef long long ll; #include using namespace std; const int MAX=200010; const int MAX_LOG=18; vector G[MAX]; int root; int parent[MAX_LOG][MAX]; int len[MAX]; int siz[MAX]; void dfs(int v,int p,int d){ parent[0][v]=p; len[v]=d; int cnt=1; for(auto x:G[v]){ if(x==p) continue; dfs(x,v,d+1); cnt+=siz[x]; } siz[v]=cnt; } void init(int u){ dfs(root,-1,0); for(int k=0;k+1len[v]) swap(u,v); for(int k=0;k=0;k--){ if(parent[k][u]!=parent[k][v]){ u=parent[k][u]; v=parent[k][v]; } } return parent[0][u]; } pair lca2(int u,int v){ for(int k=MAX_LOG-1;k>=0;k--){ if(parent[k][u]!=parent[k][v]){ u=parent[k][u]; v=parent[k][v]; } } return {u,v}; } pair lca3(int u,int l){ for(int k=MAX_LOG-1;k>=0;k--){ if(len[parent[k][u]]>=l){ u=parent[k][u]; } } return {u,parent[0][u]}; } int dist(int a,int b){ return len[a]+len[b]-2*len[lca(a,b)]; } int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); int n,q; cin>>n>>q; rep(i,n-1){ int a,b; cin>>a>>b; a--,b--; G[a].push_back(b); G[b].push_back(a); } root=0; init(n); rep(i,q){ int s,t; cin>>s>>t; s--,t--; if(len[s]==len[t]){ auto p=lca2(s,t); cout<