Pagini recente » Cod sursa (job #2907214) | Cod sursa (job #862786) | Cod sursa (job #2907577) | Cod sursa (job #2967850) | Cod sursa (job #3128065)
#include <bits/stdc++.h>
#define usu 317
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
const int nmax = 1e5 + 3;
int lvl[nmax], t[nmax], t2[nmax], n, ts, a, b;
vector <int> v[nmax];
void dfs(int nod, int ant, int lv)
{
lvl[nod] = lv;
t2[nod] = ant;
if (lv % nod == 0)
ant = nod;
for (int i = 0; i < v[nod].size(); ++i)
dfs(v[nod][i], ant, lv + 1);
}
int main()
{
ios::sync_with_stdio(false);
f >> n >> ts;
for (int i = 2; i <= n; ++i)
{
f >> t[i];
v[t[i]].push_back(i);
}
dfs(1, 0, 0);
while (ts--)
{
f >> a >> b;
while (t2[a] != t2[b])
{
if (lvl[a] > lvl[b])
a = t2[a];
else b = t2[b];
}
while (a != b)
{
if (lvl[a] > lvl[b])
a = t[a];
else b = t[b];
}
g << a << '\n';
}
return 0;
}