Pagini recente » Cod sursa (job #3170626) | Cod sursa (job #335248) | Cod sursa (job #1533675) | Cod sursa (job #653306) | Cod sursa (job #2479753)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Max=100005;
int tata[Max];
vector <int>v[Max]; int n,m; int nivel[Max];
queue <int>q;
void citire()
{
in>>n>>m; tata[1]=1;
for(int i=2;i<=n;i++)
{
int x; in>>x; tata[i]=x;
v[x].push_back(i);
}
}
/*void dfs(int nod,int tata=0)
{
nivel[nod]=nivel[tata]+1;
for(int j=0;j<v[nod].size();j++)
{
int vecin=v[nod][j];
dfs(vecin,nod);
}
} */
void bfs(int x)
{
q.push(x);
while(!q.empty())
{
int nod=q.front(); q.pop();
for(int j=0;j<v[nod].size();j++)
{
int vecin=v[nod][j];
nivel[vecin]=nivel[nod]+1;
q.push(vecin);
}
}
}
int main()
{
citire(); bfs(1);
for(int i=1;i<=m;i++)
{
int x,y; in>>x>>y;
while(x!=y)
{
if(nivel[x]>nivel[y])
x=tata[x];
else
y=tata[y];
}
out<<x<<"\n";
}
return 0;
}