Pagini recente » Cod sursa (job #724929) | Cod sursa (job #2868685) | Cod sursa (job #2414538) | Cod sursa (job #481240) | Cod sursa (job #2134611)
/*
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("carici.in", "r", stdin);
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
return 0;
}
*/
#include <bits/stdc++.h>
using namespace std;
#define NMAX 200002
int n, m, euler_cnt;
vector<int> graph[NMAX];
int level[NMAX];
int euler[NMAX];
int first[NMAX];
void euler_dfs(int node, int current_level) {
euler[++euler_cnt] = node;
level[node] = current_level;
first[node] = euler_cnt;
for (auto &next_node: graph[node]) {
euler_dfs(next_node, current_level + 1);
euler[++euler_cnt] = node;
}
}
int rmq[18][NMAX];
int lg2[NMAX];
#define pow2(x) (1 << (x))
void rmq_create() {
for (int i = 1; i <= euler_cnt; i++) {
rmq[0][i] = euler[i];
}
lg2[0] = 1;
for (int i = 2; i <= euler_cnt; i++) {
lg2[i] = lg2[i / 2] + 1;
}
for (int i = 1; i <= lg2[euler_cnt]; i++) {
for (int j = 1; j <= euler_cnt - pow2(i - 1); j++) {
if (level[rmq[i - 1][j]] < level[rmq[i - 1][j + pow2(i - 1)]]) {
rmq[i][j] = rmq[i - 1][j];
} else {
rmq[i][j] = rmq[i - 1][j + pow2(i - 1)];
}
//cout << rmq[i][j] << " ";
}//cout << endl;
}
}
int lca(int x, int y) {
x = first[x];
y = first[y];
if (x > y) swap(x, y);
int k = lg2[y - x + 1];
if (level[rmq[k][x]] < level[rmq[k][y - pow2(k) + 1]]) {
return rmq[k][x];
}
return rmq[k][y - pow2(k) + 1];
}
int main() {
freopen("carici.in", "r", stdin);
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 2, x; i <= n; i++) {
scanf("%d", &x);
graph[x].push_back(i);
}
euler_dfs(1, 0);
/*for (int i = 1; i <= euler_cnt; i++) {
cout << euler[i] << " ";
} cout << endl;
for (int i = 1; i <= n; i++) {
cout << level[i] << " ";
} cout << endl;*/
rmq_create();
for (int i = 0, x, y; i < m; i++) {
scanf("%d%d", &x, &y);
cout << lca(x, y) << "\n";
}
return 0;
}