Pagini recente » Cod sursa (job #114605) | Cod sursa (job #2609658) | Cod sursa (job #2602680) | Cod sursa (job #2963227) | Cod sursa (job #2641651)
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
///**********************
const int NMAX = 1e5 + 3, H = sqrt(NMAX);
int n, m, d[NMAX], interD[NMAX], level[NMAX];
vector<int> arbor[NMAX];
void read() {
fin >> n >> m;
for (int i = 2; i <= n; i++) {
fin >> d[i];
arbor[d[i]].push_back(i);
}
}
void dfs(int node, int interNode, int clevel) {
interD[node] = interNode;
level[node] = clevel;
if (clevel % H == 0)
interNode = node;
for (auto it : arbor[node])
dfs(it, interNode, clevel + 1);
}
int lca(int x, int y) {
while (interD[x] != interD[y])
if (level[x] > level[y])
x = interD[x];
else
y = interD[y];
while (x != y)
if (level[x] > level[y])
x = d[x];
else
y = d[y];
}
int main() {
read();
dfs(1, 0, 0);
while (m--) {
int x, y;
fin >> x >> y;
fout << lca(x, y) << newline;
}
fout.close();
return 0;
}