Pagini recente » Cod sursa (job #679304) | Cod sursa (job #809177) | Cod sursa (job #551022) | Cod sursa (job #2727164) | Cod sursa (job #1827781)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nMax = 100005;
int n, m, x, y;
int niv[nMax], dp[23][nMax];
vector <int> Graf[nMax];
inline void Dp() {
for(int i = 1; (1 << i) <= n; i++) {
for(int j = 1; j <= n; j++) {
dp[i][j] = dp[i - 1][dp[i - 1][j]];
}
}
}
inline int Stramos(int x, int y) { ///al y-lea stramos nod x
int p = x;
for(int i = 0; i <= 20; i++) {
if(y & (1 << i)) {
p = dp[i][p];
}
}
return p;
}
inline void Dfs(int nod, int nivel) {
niv[nod] = nivel;
for(auto i : Graf[nod]) {
Dfs(i, nivel + 1);
}
}
inline int Solve(int x, int y) {
if(niv[x] < niv[y]) {
swap(x, y);
}
x = Stramos(x, niv[x] - niv[y]);
if(x == y) {
return x;
}
for(int i = 20; i >= 0; i--) {
if(dp[i][x] != dp[i][y]) {
x = dp[i][x];
y = dp[i][y];
}
}
return dp[0][x];
}
int main()
{
f >> n >> m;
for(int i = 2; i <= n; i++) {
f >> x;
dp[0][i] = x;
Graf[x].push_back(i);
}
Dp();
Dfs(1, 0);
for(int i = 1; i <= m; i++) {
f >> x >> y;
g << Solve(x, y) << "\n";
}
return 0;
}