Pagini recente » Cod sursa (job #769791) | Cod sursa (job #3198484) | Cod sursa (job #1755199) | Cod sursa (job #1343937) | Cod sursa (job #2889244)
#include <fstream>
#include <queue>
#include <iostream>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,niv[100001],mat[100001][15];
int main()
{
int m;
in>>n>>m;
for(int i=2 ; i<=n ; i++)
{
in>>mat[0][i];
niv[i]=niv[mat[0][i]]+1;
}
//construim matrice cu 2^i
for(int j=1 ; j<=n ; j++)
{
for(int i=1 ; (1<<i)<=n ; i++)
{
mat[i][j]=mat[i-1][j];
int ii=i;
while(ii)
{
mat[i][j]=mat[0][mat[i][j]];
ii--;
}
}
}
while(m)
{
int a,b;
in>>a>>b;
if(niv[a]>niv[b]) //a e jos
swap(a,b);
int i=0;
while((1<<i+1)<=niv[b]-niv[a])
i++;
b=mat[i][b];
while(a!=b)
{
if(niv[a]>niv[b])
a=mat[0][a];
else b=mat[0][b];
}
out<<a<<"\n";
m--;
}
return 0;
}