Pagini recente » Cod sursa (job #2065644) | Cod sursa (job #1370629) | Cod sursa (job #1387377) | Cod sursa (job #1671791) | Cod sursa (job #1679067)
#include <iostream>
#include <fstream>
#include <vector>
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;
vector<int>low[100001];
void df(int nod, int tata, int nivel)
{
int i;
t2[nod]=tata; niv[nod]=nivel;
if(nivel%H==0) tata=nod;
for(vector<int>::iterator it=low[nod].begin();it!=low[nod].end();it++)
df(*it,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];
low[t[i]].push_back(i);
}
df(1,0,1);
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}