Pagini recente » Cod sursa (job #2916068) | Cod sursa (job #1320466) | Cod sursa (job #2138074) | Cod sursa (job #1895503) | Cod sursa (job #2973612)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> x[100001];
int niv[100001];
void DFS(int nod)
{vector<int>:: iterator I;
for(I=x[nod].begin();I<x[nod].end();I++)
if(*I>0 && niv[*I]==0)
{niv[*I]=niv[nod]+1;
DFS(*I);
}
}
int F(int nod, int v)
{if(niv[nod]==v)return nod;
else
{vector<int>:: iterator I;
for(I=x[nod].begin();I<x[nod].end();I++)
if(*I<0)return F(-(*I), v);
}
}
int F1(int a, int b)
{int a1=0, b1=0;
vector<int>:: iterator I;
for(I=x[a].begin();I<x[a].end() && a1==0;I++)
if(*I<0)a1=-(*I);
for(I=x[b].begin();I<x[b].end() && b1==0;I++)
if(*I<0)b1=-(*I);
if(a1!=b1)return F1(a1, b1);
else return a1;
}
int main()
{ int n, m, a, b;
fin>>n>>m;
for(int i=2;i<=n;i++)
{fin>>a;
x[a].push_back(i);
x[i].push_back(-a);
}
niv[1]=1;
DFS(1);
for(int i=1;i<=m;i++)
{fin>>a>>b;
if(niv[a]>niv[b])a=F(a, niv[b]);
else b=F(b, niv[a]);
if(a==b)fout<<a<<"\n";
else fout<<F1(a, b)<<"\n";
}
return 0;
}