Pagini recente » Cod sursa (job #2439084) | Cod sursa (job #1520674) | Cod sursa (job #2942002) | Cod sursa (job #2303604) | Cod sursa (job #1917812)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100005
#define KMAX 18
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, stramosi[KMAX][NMAX], level[NMAX];
vector <int> g[NMAX];
void dfs (int node, int l) {
level[node] = l;
for (int i = 0; i < g[node].size(); ++i) {
dfs(g[node][i], l+1);
}
}
int main ()
{
fin >> n >> m;
for (int i = 2; i <= n; ++i) {
fin >> stramosi[0][i];
g[stramosi[0][i]].push_back(i);
}
int mpow;
for (int k = 1; (1 << k) <= n; ++k) {
for (int i = 2; i <= n; ++i) {
stramosi[k][i] = stramosi[k-1][stramosi[k-1][i]];
}
mpow = k;
}
dfs(1,0);
/*for (int i = 1; i <= n; ++i) {
cout << level[i] << " ";
}*/
int x, y;
for (int i = 1; i <= m; ++i) {
fin >> x >> y;
if (level[x] >= level[y]) {
int diff = level[x] - level[y];
for (int k = 0; (1 << k) <= diff; ++k) {
if ((1 << k) & diff) {
x = stramosi[k][x];
}
}
}
else {
int diff = level[y] - level[x];
for (int k = 0; (1 << k) <= diff; ++k) {
if ((1 << k) & diff) {
y = stramosi[k][y];
}
}
}
int k = 0;
while (x != y) {
if (stramosi[k][x] != 0) {
x = stramosi[k][x];
y = stramosi[k][y];
}
}
fout << x << '\n';
}
fin.close();
fout.close();
return 0;
}