Pagini recente » Cod sursa (job #2980683) | Cod sursa (job #1382683) | Cod sursa (job #1980285) | Cod sursa (job #308255) | Cod sursa (job #2120985)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> g[100001];
int deep[100001],dad[100001],n,m,p,q;
void dfs(int nod)
{
for(int y=0;y<g[nod].size();y++)
{
deep[g[nod][y]]=deep[nod]+1;
dfs(g[nod][y]);
}
}
int lca(int x,int y)
{
while(deep[x]>deep[y])
x=dad[x];
while(deep[y]>deep[x])
y=dad[y];
while(x!=y)
{
x=dad[x];
y=dad[y];
}
return x;
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>dad[i];
g[dad[i]].push_back(i);
}
deep[1]=1;
dfs(1);
for(int i=1;i<=m;i++)
{
fin>>p>>q;
fout<<lca(p,q)<<'\n';
}
return 0;
}