Pagini recente » Cod sursa (job #1232977) | Cod sursa (job #227297) | Cod sursa (job #1146932) | Cod sursa (job #2545756) | Cod sursa (job #2170099)
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int radacina, niv[100004], nr, intrebari, tata, k;
int LCA[100004][22], a, b, multiplu;
vector <int> lista[100004];
void bfs(int nod, int nivel)
{
niv[nod] = nivel;
int lg = lista[nod].size();
//cout << lista[nod].size() << ' ';
for(int i=0; i < lg; i++)
{
//cout << lista[nod][i] << ' ';
bfs(lista[nod][i], nivel+1);
}
}
int main()
{
fin >> nr >> intrebari;
for(int i=2; i <= nr; i++)
{
fin >> tata;
LCA[i][0] = tata;
lista[tata].push_back(i);
}
radacina = 1;
bfs(radacina, 1);
//for(int i=1; i <= nr; i++)
//fout << niv[i] << ' ';
k = log2(nr);
for(int j=1; j <= k; j++)
{
for(int i=1; i <= nr; i++)
LCA[i][j] = LCA[LCA[i][j-1]][j-1];
}
for(int yy=1; yy <= intrebari; yy++)
{
fin >> a >> b;
if(niv[a] < niv[b])
swap(a,b);
//niv[a] >= niv[b]
multiplu = 1;
for(int i=1; i <= 20; i++)
multiplu *= 2;
for(int i=20; i >= 0; i--)
{
if(niv[a]-multiplu >= niv[b])
a = LCA[a][i];
multiplu /= 2;
}
multiplu = 1;
for(int i=1; i <= 20; i++)
multiplu *= 2;
for(int i=20; i >= 0; i--)
{
if(LCA[a][i] != LCA[b][i])
{
a = LCA[a][i];
b = LCA[b][i];
}
}
if(a != b)
fout << LCA[a][0] << '\n';
else
fout << a << '\n';
}
}