Pagini recente » Cod sursa (job #1841974) | Cod sursa (job #2239229) | Cod sursa (job #3004237) | Cod sursa (job #3231003) | Cod sursa (job #3003737)
#include <bits/stdc++.h>
using namespace std;
fstream f("lca.in", ios::in), g("lca.out", ios::out);
int tin[100001], tout[100001], t[100001][18], curt;
vector<int> adj[100001];
void dfs(int x)
{
tin[x] = ++curt;
for (auto y : adj[x])
dfs(y);
tout[x] = ++curt;
}
bool is_ancestor(int x, int y)
{
return (tin[x] <= tin[y] && tout[y] <= tout[x]);
}
int lca(int x, int y)
{
if (is_ancestor(x, y))
return x;
if (is_ancestor(y, x))
return y;
for (int i = 17; i >= 0; i--)
if (!is_ancestor(t[x][i], y))
x = t[x][i];
return t[x][0];
}
int main()
{
int n, m;
f >> n >> m;
for (int i = 2; i <= n; i++)
f >> t[i][0], adj[t[i][0]].push_back(i);
for (int j = 1; j <= 17; j++)
for (int i = 1; i <= n; i++)
t[i][j] = max(t[t[i][j - 1]][j - 1], 1);
dfs(1);
cout << is_ancestor(6, 5) << '\n';
while (m--)
{
int x, y;
f >> x >> y;
g << lca(x, y) << '\n';
}
}