Pagini recente » Cod sursa (job #405715) | Cod sursa (job #1123690) | Cod sursa (job #726342) | Cod sursa (job #647773) | Cod sursa (job #2084592)
#include <fstream>
#include <vector>
#define DIM 100001
#define DG 1000
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
int n,m;
int a,b;
int P[DIM];
int A[2][DIM],grupa=0,L[DIM];
vector<int> V[DIM];
void dfs(int nod,int level,int leg1,int leg2)
{
if(L[nod])
return;
L[nod]=level;
A[0][nod]=leg1,A[1][nod]=leg2;
for(auto to:V[nod])
{
if(level%DG==0)
dfs(to,level+1,nod,to);
else
dfs(to,level+1,nod,leg2);
}
}
int lca(int a,int b)
{
if(L[a]<L[b])
swap(a,b);
while(L[a]!=L[b])
{
if(L[A[1][a]]>=L[b])
a=A[1][a];
else
a=A[0][a];
}
while(a!=b)
a=P[a],b=P[b];
return a;
}
int main()
{
fi>>n>>m;
for(int i=2;i<=n;i++)
{
fi>>P[i];
V[i].push_back(P[i]);
V[P[i]].push_back(i);
}
dfs(1,1,1,1);
for(int i=1;i<=m;i++)
{
fi>>a>>b;
fo<<lca(a,b)<<"\n";
}
fi.close();
fo.close();
return 0;
}