Pagini recente » Cod sursa (job #1734233) | Cod sursa (job #2482435) | Cod sursa (job #1145210) | Cod sursa (job #761435) | Cod sursa (job #2674179)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
vector <int> lista[100005];
int dp[21][100005];
int lvl[100005];
void dfs(int nod, int daddy)
{
lvl[nod] = lvl[daddy] + 1;
for (int i = 0; i < lista[nod].size(); i++)
{
int x = lista[nod][i];
dfs(x, nod);
}
}
int lca(int x, int y)
{
int lg = 20;
while (lvl[x] < lvl[y])
{
if (lvl[x] <= lvl[dp[lg][y]])
y = dp[lg][y];
lg--;
}
lg = 20;
while (lvl[x] > lvl[y])
{
if (lvl[y] <= lvl[dp[lg][x]])
x = dp[lg][x];
lg--;
}
lg = 20;
while (x != y && lg > -1)
{
if(dp[lg][x] != dp[lg][y])
{
x = dp[lg][x];
y = dp[lg][y];
}
lg--;
}
if (x != y)
return dp[0][x];
return x;
}
int main()
{
int i, j, n, m;
cin >> n >> m;
for (i = 2; i <= n; i++)
{
int daddy;
cin >> daddy;
dp[0][i] = daddy;
lista[daddy].push_back(i);
}
dfs(1, 0);
for (i = 1; i <= 20; i++)
for (j = 1; j <= n; j++)
dp[i][j] = dp[i - 1][dp[i - 1][j]];
for (i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
cout << lca(x, y) << '\n';
}
return 0;
}