Pagini recente » Cod sursa (job #1845561) | Cod sursa (job #1632949) | Cod sursa (job #2042587) | Cod sursa (job #1949699) | Cod sursa (job #3292228)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> L[100005];
int up[19][100005], tin[100005], tout[100005], t, n;
void DFS(int k, int ant = 0)
{
tin[k] = ++t;
for (int i = 1; i <= 18; i++)
up[i][k] = up[i - 1][up[i - 1][k]];
for (int i : L[k])
if (i != ant)
DFS(i, k);
tout[k] = ++t;
}
bool isAncestor(int i, int j)
{
if (i == 0) return true;
return tin[i] <= tin[j] && tout[i] >= tout[j];
}
int LCA(int u, int v)
{
if (isAncestor(u, v))
return u;
if (isAncestor(v, u))
return v;
for (int i = 18; i >= 0; i--)
if (!isAncestor(up[i][u], v))
u = up[i][u];
return up[0][u];
}
int main()
{
int i, j, k, q;
fin >> n >> q;
for (i = 2; i <= n; i++)
{
fin >> up[0][i];
L[up[0][i]].push_back(i);
}
DFS(1);
while (q--)
{
fin >> i >> j;
fout << LCA(i, j) << "\n";
}
return 0;
}