Pagini recente » Cod sursa (job #2424468) | Cod sursa (job #1454451) | Cod sursa (job #289851) | Cod sursa (job #1456067) | Cod sursa (job #2486141)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> G[100005];
int TT[100005];
int level[100005];
int LCA(int x,int y){
if(level[x] < level[y]){
swap(x,y);
}
while(level[x] != level[y]){
x = TT[x];
}
while(x != y){
x = TT[x];
y = TT[y];
}
return x;
}
void dfs(int x,int tata){
level[x] = level[tata] + 1;
for(int i = 0; i < G[x].size(); i++){
dfs(G[x][i],x);
}
}
int main ()
{
int i,n,m,a1,a2;
fin>>n>>m;
for(i = 2; i <= n; i++){
fin>>TT[i];
G[TT[i]].push_back(i);
}
dfs(1,0);
for(i = 1; i <= m; i++){
fin>>a1>>a2;
fout<<LCA(a1,a2)<<'\n';
}
return 0;
}