Pagini recente » Cod sursa (job #51466) | Cod sursa (job #2343891) | Cod sursa (job #1244609) | Cod sursa (job #2918371) | Cod sursa (job #2084641)
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#define Nmax 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int niv[Nmax], H, ad[Nmax], h, n, m, a, b, tata[Nmax], x;
vector<int>v[Nmax];
void DFS(int nod, int adancime, int nd)
{
niv[nod] = nd;
for(int i = 0 ; i < v[nod].size(); i++)
{
int fiu = v[nod][i];
if(adancime % h == 0)DFS(fiu, adancime + 1, nod);
else DFS(fiu, adancime + 1, nd);
}
}
void dfs(int nod, int adancime)
{
H = max(H, adancime);
for(int i = 0 ; i < v[nod].size(); i++)
{
int fiu = v[nod][i];
ad[fiu] = ad[nod] + 1;
dfs(fiu, adancime + 1);
}
}
int lca(int x, int y)
{
while(niv[x] != niv[y])
{
if(ad[x] > ad[y]) x = niv[x];
else y = niv[y];
}
while(x != y)
{
if(ad[x] > ad[y]) x = niv[x];
else y = niv[y];
}
return x;
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n - 1; i++)
{
fin >> x;
tata[i + 1] = x;
v[x].push_back(i + 1);
}
dfs(1, 1);
h = sqrt(H);
DFS(1, 1, 1);
for(int i = 1; i <= m; i++)
{
fin >> a >> b;
fout << lca(a, b) << '\n';
}
return 0;
}