Pagini recente » Cod sursa (job #106271) | Cod sursa (job #290477) | Cod sursa (job #674038) | Cod sursa (job #1501574) | Cod sursa (job #2392245)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n, m, v[100001];
int euler[400001], l[100001], k, pozmin[100001];
vector <int> Muchii[100001];
inline void DFS(int nod, int nivel)
{
int vecin;
l[nod] = nivel;
euler[++k] = nod;
pozmin[nod] = min(pozmin[nod], k);
for (int i = 0; i < Muchii[nod].size(); ++i)
{
vecin = Muchii[nod][i];
DFS(vecin, nivel + 1);
euler[++k] = nod;
pozmin[nod] = min(pozmin[nod], k);
}
}
inline void citire()
{
int x;
in >> n >> m;
for (int i = 2; i <= n; ++i)
{
in >> x;
Muchii[x].push_back(i);
}
}
int main()
{
int x, y;
citire();
for (int i = 1; i <= n; ++i)
pozmin[i] = INT_MAX;
DFS(1, 0);
for (int q = 1; q <= m; ++q)
{
in >> x >> y;
int mind = INT_MAX, rez;
if (pozmin[x] > pozmin[y])
swap(x, y);
for (int i = pozmin[x]; i <= pozmin[y]; ++i)
{
if (l[euler[i]] < mind)
{
mind = l[euler[i]];
rez = euler[i];
}
}
out << rez << '\n';
}
return 0;
}