Pagini recente » Cod sursa (job #1237359) | Cod sursa (job #3078) | Cod sursa (job #1219484) | Cod sursa (job #717638) | Cod sursa (job #2244969)
#include <bits/stdc++.h>
#define N 100002
using namespace std;
int n, m, euler[2 * N], nr, first[N], h[N], r[2 * N][30], lg[2 * N];
vector<int> G[N];
void DFS(int s, int p) {
euler[++nr] = s;
for (int x : G[s])
if (x != p) {
h[x] = h[s] + 1;
DFS(x, s);
euler[++nr] = s;
}
}
void rmq() {
int i, j, p;
for (i = 1; i <= nr; i++)
r[i][0] = euler[i];
for (j = 1, p = 1; p << 1 < nr; j++, p <<= 1)
for (i = 1; i <= nr - (p << 1) + 1; i++)
if (h[r[i][j - 1]] < h[r[i + p][j - 1]])
r[i][j] = r[i][j - 1];
else
r[i][j] = r[i + p][j - 1];
j = 0;
for (i = 1, p = 2; i <= nr; i++) {
if (i == p) j++, p <<= 1;
lg[i] = j;
}
}
int lca(int x, int y) {
int l = lg[y - x + 1];
if (h[r[x][l]] < h[r[y - (1 << l) + 1][l]])
return r[x][l];
return r[y - (1 << l) + 1][l];
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
int i, x, y;
fin >> n >> m;
for (i = 2; i <= n; i++) {
fin >> x;
G[x].push_back(i);
}
DFS(1, 0);
for (i = nr; i >= 0; i--)
first[euler[i]] = i;
rmq();
while (m--) {
fin >> x >> y;
fout << lca(min(first[x], first[y]), max(first[x], first[y])) << '\n';
}
return 0;
}