Pagini recente » Cod sursa (job #154043) | Cod sursa (job #550166) | Cod sursa (job #2751056) | Cod sursa (job #734595) | Cod sursa (job #1812979)
// CTI
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector <int> a[100005];
int v[100005], l[100005], tata[100005];
void dfs(int nod, int tnod, int nivel) {
l[nod] = nivel;
tata[nod] = tnod;
for (int i = 0; i < a[nod].size(); ++i) {
dfs(a[nod][i], nod, nivel + 1);
}
}
int LCA(int x, int y) {
while (tata[x] != tata[y]) {
if (l[x] > l[y]) {
x = tata[x];
} else {
y = tata[y];
}
}
return tata[x];
}
int main()
{
int n, q; cin >> n >> q;
for (int i = 2; i <= n; ++i) {
cin >> v[i];
a[v[i]].push_back(i);
l[i] = 0;
}
dfs(1, 0 , 0);
for (int i = 0; i < q; ++i) {
int x, y;
cin >> x >> y;
cout << LCA(x, y) << '\n';
}
return 0;
}