Pagini recente » Cod sursa (job #2128964) | Cod sursa (job #255976) | Cod sursa (job #2902413) | Cod sursa (job #1256084) | Cod sursa (job #2973385)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 1e5 + 7;
vector<vector<int>> v(NMAX);
int dad[NMAX], lvl[NMAX];
void dfs(int nod, int lv)
{
lvl[nod] = lv;
for (int i: v[nod])
{
dfs(i, lv + 1);
}
}
int lca(int x, int y)
{
if(lvl[x] < lvl[y])
swap(x, y);
while (lvl[x] > lvl[y])
x = dad[x];
while(x != y)
y = dad[y], x = dad[x];
return x;
}
int main()
{
int n, q;
fin >> n >> q;
for (int nod = 2; nod <= n; nod++)
{
fin >> dad[nod];
v[dad[nod]].push_back(nod);
}
dfs(1, 1);
while (q--)
{
int x, y;
fin >> x >> y;
fout << lca(x, y) << "\n";
}
return 0;
}