Pagini recente » Cod sursa (job #1945092) | Cod sursa (job #2909610) | Cod sursa (job #68172) | Cod sursa (job #2808363) | Cod sursa (job #1399139)
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
vector<int> g[100002];
int pos[100002], tour[200002][20], level[200002];
int k = 0;
void add(int node, int lv)
{
tour[++k][0] = node;
level[node] = lv;
if (!pos[node])
pos[node] = k;
}
void dfs(int node, int lv)
{
add(node, lv);
for (int i = 0; i < g[node].size(); i++)
{
dfs(g[node][i], lv+1);
add(node, lv);
}
}
inline int minLv(int a, int b)
{
if (level[a] < level[b])
return a;
return b;
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int x, i = 2; i <= n; i++)
{
scanf("%d", &x);
g[x].push_back(i);
}
dfs(1, 0);
for (int j = 1; j <= log2(k); j++)
for (int i = 1; i <= k+1 - (1<<j); i++)
tour[i][j] = minLv(tour[i][j-1], tour[i + (1<<(j-1))][j-1]);
for (int x, y, l; m; m--)
{
scanf("%d%d", &x, &y);
int a = pos[x];
int b = pos[y];
if (a > b)
{
int t = a;
a = b;
b = t;
}
l = log2(b-a+1);
printf("%d\n", minLv(tour[a][l], tour[b+1-(1<<l)][l]));
}
return 0;
}