Pagini recente » Cod sursa (job #252739) | Cod sursa (job #3239514) | Cod sursa (job #1589926) | Cod sursa (job #2943288) | Cod sursa (job #1985498)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N, Q, dad[NMAX], level[NMAX], x, y;
vector < int > G[NMAX];
void dfs(int node, int crtLevel) {
level[node] = crtLevel;
for (auto it : G[node]) {
dfs(it, crtLevel + 1);
}
}
int lca(int a, int b) {
if (level[a] > level[b]) {
swap(a, b);
}
for (; level[a] != level[b]; b = dad[b]);
for (; a != b; a = dad[a], b = dad[b]);
return a;
}
int main() {
f >> N >> Q;
for (int i = 2; i <= N; ++i) {
f >> dad[i];
G[dad[i]].push_back(i);
}
dfs(1, 0);
while (Q--) {
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}