求 LCA
模板
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int N=100100;
int n,m,s,ecnt,t,last[N],deep[N],dp[N][20];
bool inq[N];
struct EDGE{int to,nt;}e[N<<1];
inline void add(int u,int v){e[++ecnt]=(EDGE){v,last[u]};last[u]=ecnt;}
void dfs(int u){for(int i=last[u];i;i=e[i].nt)if(!deep[e[i].to]){deep[e[i].to]=deep[u]+1;dp[e[i].to][0]=u;dfs(e[i].to);}}
void initial(){for(int j=1;(1<<j)<=n;j++)for(int i=1;i<=n;i++)dp[i][j]=dp[dp[i][j-1]][j-1];}
void query(int x,int y)
{
if(deep[x]<deep[y])swap(x,y);
int len=deep[x]-deep[y];
for(int i=0;(1<<i)<=len;i++)
{if((1<<i)&len)x=dp[x][i];}
if(x==y){printf("%d\n",x);return ;}
for(int i=log2(N);i>=0;i--)
{if(dp[x][i]!=dp[y][i])x=dp[x][i],y=dp[y][i];}
x=dp[x][0];
printf("%d\n",x);
}
int main()
{
n=read();m=read();int u,v;
for(int i=1;i<n;i++){u=read();v=read();add(u,v);add(v,u);}
deep[1]=1;dfs(1);initial();
while(m--){u=read();v=read();query(u,v);}
return 0;
}