Pagini recente » Cod sursa (job #924135) | Cod sursa (job #1677273) | Cod sursa (job #3223120) | Cod sursa (job #2706401) | Cod sursa (job #1350137)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <math.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout ("lca.out");
int n;
int dp[100000][17];
int dep[100000];
void init()
{
for (int i = 1; 1 << i < n; i++)
for (int j = 0; j < n; j++)
dp[j][i] = dp[ dp[j][i - 1] ][i - 1];
}
int getp(int x, int d)
{
int c = x;
while (d)
{
int k = 0;
k = log2(d);
d ^= 1 << k;
c = dp[c][k];
}
return c;
}
int lca(int x, int y)
{
if (dep[x] < dep[y])
y = getp(y, dep[y] - dep[x]);
else x = getp(x, dep[x] - dep[y]);
for (int i = log2(dep[x]); i >= 0 && x != y; i--)
if (dp[x][i] != dp[y][i])
{
x = dp[x][i];
y = dp[y][i];
i = min(i+1, (int)log2(dep[x]));
}
if (x!=y) x = dp[x][0];
return x;
}
int m;
int main()
{
fin >> n>>m;
dep[0] = 0;
dp[0][0] = 0;
for (int i = 1; i < n; i++)
{
fin >> dp[i][0];
dp[i][0]--;
if (i) dep[i] = dep[ dp[i][0] ] + 1;
}
init();
for (int i=0; i<m; i++)
{
int x,y;
fin>>x>>y;
x--,y--;
fout<<lca(x,y)+1<<'\n';
}
return 0;
}