Pagini recente » Cod sursa (job #1799574) | Cod sursa (job #2893283) | Statistici Gyorfi Tamas (tamasgy) | Cod sursa (job #1315064) | Cod sursa (job #2949596)
//#include <bits/stdc++.h>
#include <fstream>
#include <vector>
#define NMAX 100000
#define LOG 17
using namespace std;
typedef long long ull;
vector<int> tree[NMAX];
int depth[NMAX];
int up[NMAX][LOG];
ifstream cin("lca.in");
ofstream cout("lca.out");
void dfs(int parent) {
for (int i = 0; i < tree[parent].size(); i++) {
int child = tree[parent][i];
depth[child] = depth[parent] + 1;
up[child][0] = parent;
for (int k = 1; k < LOG; k++) {
up[child][k] = up[up[child][k - 1]][k - 1];
}
dfs(child);
}
}
int lca(int a, int b) {
// Get A and B to the same depth
if (depth[a] < depth[b]) {
swap(a, b);
}
int k = depth[a] - depth[b];
for (int i = LOG - 1; i >= 0; i--) {
if (k & (1 << i)) {
a = up[a][i];
}
}
if (a == b) {
return a;
}
for (int k = LOG - 1; k >= 0; k--) {
if (up[a][k] != up[b][k]) {
a = up[a][k];
b = up[b][k];
}
}
return up[a][0];
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i < n; i++) {
int r;
cin >> r;
r--;
tree[r].push_back(i);
}
dfs(0);
while (m--) {
int a, b;
cin >> a >> b;
cout << lca(a-1, b-1) + 1 << '\n';
}
return 0;
}