Pagini recente » Cod sursa (job #1148915) | Cod sursa (job #1510003) | Cod sursa (job #2258153) | Cod sursa (job #2840257) | Cod sursa (job #3260708)
#include <fstream>
#include <vector>
#define NMAX 100005
#define LGMAX 20
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m;
int up[NMAX][LGMAX];
int level[NMAX];
vector<int> edges[NMAX];
void dfs(int node, int parent, int lvl) {
level[node] = lvl;
up[node][0] = parent;
for (auto child : edges[node]) {
for (int i = 1; i < LGMAX; i++) {
up[child][i] = up[up[child][i - 1]][i];
}
dfs(child, node, lvl + 1);
}
}
int main() {
f >> n >> m;
for (int i = 2; i <= n ; i++) {
int x;
f >> x;
edges[x].push_back(i);
}
dfs(1, 1, 0);
for (int i = 0; i < m; i++) {
int x, y;
f >> x >> y;
if (level[x] < level[y]) {
swap(x, y);
}
int diff = level[x] - level[y];
for (int i = LGMAX - 1; i >= 0; i--) {
if (diff & (1 << i)) {
x = up[x][i];
}
}
if (x == y) {
g << x << "\n";
continue;
}
for (int i = LGMAX - 1; i >= 0; i--) {
if (up[x][i] != up[y][i]) {
x = up[x][i];
y = up[y][i];
}
}
g << up[x][0] << "\n";
}
return 0;
}