Pagini recente » Cod sursa (job #2334346) | Cod sursa (job #1573537) | Cod sursa (job #2326377) | Cod sursa (job #331937) | Cod sursa (job #2208414)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, LG = 20;
int v[N], dp[LG][N];
int f[N];
vector <int> g[N];
void dfs(int n) {
for (auto i : g[n]) {
if (v[i] == 0) {
f[i] = f[n] + 1;
v[i] = n;
dfs(i); } } }
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int n, m, x, q, r;
scanf("%d %d", &n, &m);
for (int i = 2; i <= n; i++) {
scanf("%d", &x);
g[x].push_back(i);
g[i].push_back(x); }
f[1] = 1;
v[1] = -1;
dfs(1);
v[1] = 0;
for (int i = 1; i <= n; i++) {
dp[0][i] = v[i]; }
for (int i = 1; i < LG; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = dp[i - 1][dp[i - 1][j]]; } }
for (int i = 1; i <= m; i++) {
int y;
scanf("%d %d", &x, &y);
if (f[x] < f[y]) {
r = f[y] - f[x];
int p = 0;
while (r) {
if (r % 2 == 1) {
y = dp[p][y];}
p++;
r = r / 2; } }
if (f[x] > f[y]) {
r = f[x] - f[y];
int p = 0;
while (r) {
if (r % 2 == 1) {
x = dp[p][x]; }
p++;
r = r / 2; } }
for (int p = LG - 1; p >= 0; p--) {
if (dp[p][x] != dp[p][y]) {
x = dp[p][x];
y = dp[p][y]; } }
if (x == y)
printf("%d\n", x);
else
printf("%d\n", v[x]); }
return 0; }