Pagini recente » Cod sursa (job #1745976) | Cod sursa (job #1654967) | Cod sursa (job #2024705) | Cod sursa (job #816852) | Cod sursa (job #2306952)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int NMAX = 100005;
vector<int> g[NMAX];
int h[NMAX], dad[NMAX];
void dfs(int node) {
for(auto it : g[node]) {
if(h[it] == 0) {
h[it] = h[node] + 1;
dad[it] = node;
dfs(it);
}
}
}
int main() {
int n, m;
in >> n >> m;
for(int i = 2; i <= n; i ++) {
int x;
in >> x;
g[x].push_back(i);
g[i].push_back(x);
}
h[1] = 1;
dfs(1);
vector<int> lg(n + 1, 0);
for(int i = 2; i <= n; i ++)
lg[i] = 1 + lg[i >> 1];
vector<vector<int>> dp(lg[n] + 1, vector<int> (n + 1, 0));
for(int i = 1; i <= n; i ++)
dp[0][i] = dad[i];
for(int p = 1; p <= lg[n]; p ++)
for(int i = 1; i <= n; i ++)
dp[p][i] = dp[p - 1][dp[p - 1][i]];
for(int qr = 1; qr <= m; qr ++) {
int x, y;
in >> x >> y;
if(h[x] < h[y])
swap(x, y);
for(int step = lg[n]; step >= 0; step --)
if(h[dp[step][x]] >= h[y])
x = dp[step][x];
for(int step = lg[n]; step >= 0; step --)
if(dp[step][x] != dp[step][y] && dp[step][x] != 0 && dp[step][y] != 0) {
x = dp[step][x];
y = dp[step][y];
}
if(x != y)
x = dad[x];
out << x << "\n";
}
return 0;
}