Pagini recente » Monitorul de evaluare | Cod sursa (job #808079) | Cod sursa (job #1976145) | Cod sursa (job #1333242) | Cod sursa (job #1212936)
#include <cstdio>
#define nmax 100005
using namespace std;
int n, m, T[nmax], Lev[nmax];
void dfs(int node, int k)
{
Lev[node] = k;
for (int i = 1; i <= n; ++i)
{
if (T[i] == node)
dfs(i, k + 1);
}
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i < n; ++i)
{
int x;
scanf("%d", &x);
T[i + 1] = x;
}
dfs(1, 0);
for (; m; --m)
{
int x, y;
scanf("%d%d", &x, &y);
while (x != y)
{
if (Lev[x] > Lev[y])
x = T[x];
else
y = T[y];
}
printf("%d\n", x);
}
return 0;
}