Pagini recente » Cod sursa (job #3212699) | Cod sursa (job #1664479) | Cod sursa (job #1791962) | Cod sursa (job #1548343) | Cod sursa (job #3286993)
#include <fstream>
#include <vector>
#define NMAX 100000
#define LOG 18
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int> g[NMAX + 1];
int up[NMAX + 1][LOG];
int n, m;
int viz[NMAX + 1];
void dfs(int nod) {
for (auto i : g[nod]) {
if (!viz[i]) {
up[i][0] = nod;
for (int j = 1; j < LOG; ++j)
up[i][j] = up[up[i][j - 1]][j - 1];
viz[i] = viz[nod] + 1;
dfs(i);
}
}
}
int lca(int a, int b) {
if (viz[a] < viz[b]) swap(a, b);
int k = viz[a] - viz[b];
for (int i = LOG - 1; i >= 0; --i)
if (k & (1 << i))
a = up[a][i];
if (a == b) return a;
for (int i = LOG - 1; i >= 0; --i)
if (up[a][i] != up[b][i]) {
a = up[a][i];
b = up[b][i];
}
return up[a][0];
}
int main() {
cin >> n >> m;
for (int val, i = 2; i <= n; ++i) {
cin >> val;
g[i].push_back(val);
g[val].push_back(i);
}
viz[1] = 1;
dfs(1);
for (int a, b, i = 1; i <= m; ++i) {
cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;
}