Pagini recente » Cod sursa (job #1191178) | Cod sursa (job #2075385) | Cod sursa (job #2843317) | Cod sursa (job #2519430) | Cod sursa (job #3206825)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
#define nmax 100010
#define log 18
int n, m, t;
int pin[nmax], pout[nmax], dp[log][nmax];
vector<int> v[nmax];
void dfs(int nod, int tata)
{
pin[nod] = ++t;
dp[0][nod] = tata;
for (int i = 1; i < log; ++i)
{
dp[i][nod] = dp[i - 1][dp[i - 1][nod]];
}
int lg = v[nod].size();
for (int i = 0; i < lg; ++i)
{
if (v[nod][i] != tata)
dfs(v[nod][i], nod);
}
pout[nod] = ++t;
}
bool isAnc(int a, int b)
{
// g << a << ' ' << b << '\n';
return pin[a] < pin[b] && pout[a] > pout[b];
return 0;
}
int lca(int a, int b)
{
if (isAnc(a, b))
return a;
if (isAnc(b, a))
return b;
for (int i = log - 1; i >= 0; --i)
{
if (!isAnc(dp[i][a], b))
{
a = dp[i][a];
}
}
return dp[0][a];
}
int main()
{
f >> n >> m;
for (int i = 1; i < n; ++i)
{
int x;
f >> x;
v[x].push_back(i + 1);
}
dfs(1, 1);
// for (int j = 0; j <= 3; ++j)
// {
// for (int i = 1; i <= n; ++i)
// {
// g << dp[j][i] << ' ';
// }
// g << '\n';
// }
int x, y;
for (int i = 1; i <= m; ++i)
{
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}