对着书打的,但是输出都是0
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500010;
int depth[MAXN];
int lg2[MAXN];
int pre[MAXN][32];
int n, m;
vector<int> nxt[MAXN];
inline int power2(const int &p) { return 1 << p; }
inline int logar2(const int &p) { return lg2[p]; }
inline void preprocessing(const int &n)
{
lg2[0] = -1;
for (int i = 1; i <= n; i++)
{
lg2[i] = lg2[i / 2] + 1;
depth[i] = 0;
}
queue<int> q;
depth[s] = 1;
q.push(s);
while (!q.empty())
{
int cur = q.front();
q.pop();
for (int i = 0; i < nxt[cur].size(); i++)
{
int v = nxt[cur][i];
if (depth[v])
return;
depth[v] = depth[cur] + 1;
pre[v][0] = cur;
for (int j = 1; j <= logar2(n) + 1; j++)
pre[v][j] = pre[pre[v][j - 1]][j - 1];
q.push(v);
}
}
}
int query(int x, int y, int n)
{
if (depth[x] < depth[y])
return query(y, x, n);
int k = logar2(n) + 1;
for (int i = k; i >= 0; i--)
if (depth[pre[x][i]] >= depth[y])
x = pre[x][i];
if (x == y)
return x;
for (int i = k; i >= 0; i--)
if (pre[x][i] != pre[y][i])
{
x = pre[x][i];
y = pre[y][i];
}
return pre[x][0];
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1, x, y; i < n; i++)
{
scanf("%d%d", &x, &y);
nxt[x].push_back(y);
}
preprocessing(n);
for (int i = 1, x, y; i <= m; i++)
{
scanf("%d%d", &x, &y);
printf("%d\n", query(x, y, n));
}
return 0;
}