Pagini recente » Cod sursa (job #3236853) | Cod sursa (job #46824) | Cod sursa (job #1393599) | Cod sursa (job #1910983) | Cod sursa (job #2353112)
#include <bits/stdc++.h>
#define MAX 10000
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector < int > G[MAX];
int n, m, t[MAX], lvl[MAX];
void facemlca (int a, int b){
if (t[a] == t[b]){
g << t[a] << '\n';
return;
}
if (t[a] == b){
g << b << '\n';
return;
}
if (t[b] == a){
g << a << '\n';
return;
}
while (t[a] != t[b]){
while (lvl[a] < lvl[b]){
a = t[a];
}
while (lvl[b] < lvl[a]){
b = t[b];
}
if (lvl[a] == lvl[b] && t[a]!=t[b]){
a = t[a];
b = t[b];
}
}
g << t[a] << '\n';
}
int main()
{
f >> n >> m;
lvl[1] = 1;
for (int i = 1; i <= n-1; i++){
int x;
f >> x;
t[i+1] = x;
lvl[i+1] = lvl[x] + 1;
G[x].push_back(i + 1);
G[i + 1].push_back(x);
}
while (m--){
int a, b;
f >> a >> b;
facemlca (a,b);
}
return 0;
}