Pagini recente » Cod sursa (job #400503) | Cod sursa (job #1518008) | Cod sursa (job #2660058) | Cod sursa (job #179731) | Cod sursa (job #2662984)
#include <bits/stdc++.h>
#define n_max 100000
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m;
int nivel[n_max + 5], lant[n_max + 5], heavy[n_max + 5], t[n_max + 5], size[n_max + 5];
vector<int> graf[n_max + 5];
void Read()
{
f>>n>>m;
for(int i = 2;i <= n;++i)
f>>t[i], graf[t[i]].push_back(i);
}
void dfs(int nod, int parinte)
{
nivel[nod] = nivel[parinte] + 1;
size[nod] = 1;
int maxim = 0;
for(auto it : graf[nod])
{
dfs(it, nod);
size[nod] += size[it];
if(maxim < size[it])
maxim = size[it], heavy[nod] = it;
}
}
void descompunere(int nod, int sus)
{
lant[nod] = sus;
if(heavy[nod])
descompunere(heavy[nod], sus);
for(auto it : graf[nod])
if(it != heavy[nod])
descompunere(it, it);
}
int solve(int x, int y)
{
while(lant[x] != lant[y])
{
if(nivel[lant[x]] < nivel[lant[y]])
swap(x, y);
x = t[lant[x]];
}
return (nivel[x] > nivel[y] ? y : x);
}
void Solve()
{
dfs(1, 0);
descompunere(1, 1);
int x, y;
for(int i = 1;i <= m;++i)
f>>x>>y, g<<solve(x, y)<<'\n';
}
int main()
{
Read();
Solve();
return 0;
}