Pagini recente » Cod sursa (job #2172069) | Cod sursa (job #3243246) | Cod sursa (job #232625) | Cod sursa (job #1748558) | Cod sursa (job #1670837)
#include <bits/stdc++.h>
using namespace std;
#define NMax 100008
ifstream f("lca.in");
ofstream g("lca.out");
int R,n,m,tata[NMax],x,y,niv[NMax];
void nivel(int i)
{
if(niv[tata[i]]==0)
nivel(tata[i]);
niv[i]=niv[tata[i]]+1;
}
int LCA(int x,int y)
{
while(niv[x]!=niv[y])
if(niv[x]>niv[y])
x=tata[x];
else
y=tata[y];
while(x!=y)
{
x=tata[x];
y=tata[y];
}
return x;
}
int main()
{
f>>n>>m;
int i,j;
R=1;
for(i=2; i<=n; i++)
f>>tata[i];
niv[R]=1;
for(i=1; i<=n; i++)
if(niv[i]==0)
nivel(i);
for(i=1; i<=m; i++)
{
f>>x>>y;
g<<LCA(x,y)<<'\n';
}
return 0;
}