Pagini recente » Cod sursa (job #1534792) | Cod sursa (job #2487877) | Cod sursa (job #1600170) | Cod sursa (job #1379786) | Cod sursa (job #1918672)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nMax = 100003;
vector <int> Graf[nMax];
int dp[24][nMax]; ///al 2 ^ i lea stramos al lui j
int niv[nMax], n, m;
inline void Dpstramosi() {
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 al lui x
int p = x;
for(int i = 0; i <= n; i++) {
if(y & (1 << i)) {
p = dp[i][p];
}
}
return p;
}
inline void Dfs(int nod, int nivel) {
niv[nod] = nivel;
for(const auto &i : Graf[nod]) {
Dfs(i, nivel + 1);
}
}
inline int Lca(int x, int y) {
if(niv[y] > niv[x]) {
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()
{
int x, y;
f >> n >> m;
for(int i = 2; i <= n; i++) {
f >> x;
dp[0][i] = x;
Graf[x].push_back(i);
}
Dpstramosi();
Dfs(1, 0);
for(int i = 1; i <= m; i++) {
f >> x >> y;
g << Lca(x, y) << "\n";
}
return 0;
}