Pagini recente » Cod sursa (job #286371) | Cod sursa (job #928604) | Cod sursa (job #1202873) | Cod sursa (job #1531901) | Cod sursa (job #3164327)
#include <iostream>
#include <fstream>
using namespace std;
#define MaxN 100000
int dp[18][MaxN], nivel[MaxN];
int ancestor(int x, int p)
{
int cnt=0;
while(p>0)
{
if(p%2==1) x=dp[cnt][x];
p=p/2;
cnt++;
}
return x;
}
int main()
{
ifstream in("lca.in");
ofstream out("lca.out");
int n, m, i, u, v, j, st, dr, mij;
in>>n>>m;
dp[0][1]=0;
nivel[1]=0;
for(i=2; i<=n; i++)
{
in>>dp[0][i];
nivel[i]=nivel[dp[0][i]]+1;
}
for(i=1; i<=17; i++)
{
for(j=1; j<=n; j++)
{
dp[i][j]=dp[i-1][dp[i-1][j]];
}
}
for(i=0; i<m; i++)
{
in>>u>>v;
if(nivel[v]<nivel[u])
{
u=ancestor(u, nivel[u]-nivel[v]);
}
else if(nivel[u]<nivel[v])
{
v=ancestor(v, nivel[v]-nivel[u]);
}
//cout<<ancestor(4, 1)<<" ";
//cout<<u<<" "<<v<<endl;
if(u==v) out<<u<<'\n';
else
{
j=17;
while(j>=0)
{
if(dp[j][u]!=dp[j][v])
{
u=dp[j][u];
v=dp[j][v];
}
else
{
j--;
}
}
out<<dp[0][u]<<'\n';
}
}
return 0;
}