Pagini recente » Cod sursa (job #2673175) | Cod sursa (job #2108405) | Cod sursa (job #1568897) | Cod sursa (job #1279368) | Cod sursa (job #1679044)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,t[100001],t2[100001],niv[100001],x,y,H=200;
bool frunza[100001];
void df(int nod, int tata, int nivel)
{
int i;
t2[nod]=tata; niv[nod]=nivel;
if(nivel%H==0) tata=nod;
for(i=1;i<=n;i++)
if(t[i]==nod) df(i,tata,nivel+1);
}
int lca(int x, int y)
{
while(t2[x]!=t2[y])
if(niv[x]>niv[y]) x=t2[x];
else y=t2[y];
while(x!=y)
if(niv[x]>niv[y]) x=t[x];
else y=t[y];
return x;
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++)
fin>>t[i];
df(1,0,1);
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}