Pagini recente » Cod sursa (job #1843017) | Cod sursa (job #2678142) | Cod sursa (job #2379955) | Cod sursa (job #550687) | Cod sursa (job #2509922)
#include <bits/stdc++.h>
using namespace std;
//varianta 4 - Stramosi
ifstream f("lca.in");
ofstream g("lca.out");
const int nmax = 100005;
int level[nmax];
int dp[nmax][17];
vector <int> son[nmax];
void dfs(int nod, int lvl)
{
level[nod] = lvl;
for (auto el : son[nod])
{
dp[el][0] = nod;
dfs(el, lvl + 1);
}
}
int solve(int a, int b)
{
if (level[a] < level[b])
swap(a, b);
int pow;
for (pow = 1; (1 << pow) < level[a]; ++ pow);
while (pow >= 0)
{
if (level[a] - (1 << pow) >= level[b])
a = dp[a][pow];
-- pow;
}
if (a == b)
return a;
for (pow = 1; (1 << pow) < level[a]; ++ pow);
while(pow >= 0)
{
if (dp[a][pow] != dp[b][pow])
{
a = dp[a][pow];
b = dp[b][pow];
}
-- pow;
}
return dp[a][0];
}
int main()
{
int n, m;
f >> n >> m;
for (int i = 1; i < n; ++ i)
{
int x;
f >> x;
son[x].push_back(i + 1);
}
dfs(1, 0);
for (int nod = 1; nod <= n; ++ nod)
for (int j = 1; (1 << j) <= level[nod]; ++ j)
dp[nod][j] = dp[dp[nod][j - 1]][j - 1];
for (int i = 1; i <= m; ++ i)
{
int a, b;
f >> a >> b;
g << solve(a, b) << '\n';
}
}