Pagini recente » Cod sursa (job #936923) | Cod sursa (job #2386324) | Cod sursa (job #2649597) | Cod sursa (job #3164052) | Cod sursa (job #2973611)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<pair<int, int> > x[100001];
int niv[100001];
void DFS(int nod)
{vector<pair<int, int> >:: iterator I;
for(I=x[nod].begin();I<x[nod].end();I++)
if(I->second!=-1 && niv[I->first]==0)
{niv[I->first]=niv[nod]+1;
DFS(I->first);
}
}
int F(int nod, int v)
{if(niv[nod]==v)return nod;
else
{vector<pair<int, int> >:: iterator I;
for(I=x[nod].begin();I<x[nod].end();I++)
if(I->second==-1)return F(I->first, v);
}
}
int F1(int a, int b)
{int a1=0, b1=0;
vector<pair<int, int> >:: iterator I;
for(I=x[a].begin();I<x[a].end() && a1==0;I++)
if(I->second==-1)a1=I->first;
for(I=x[b].begin();I<x[b].end() && b1==0;I++)
if(I->second==-1)b1=I->first;
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, 1});
x[i].push_back({a, -1});
}
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;
}