Pagini recente » Cod sursa (job #1638994) | Cod sursa (job #1659264) | Cod sursa (job #440081) | Cod sursa (job #2386559) | Cod sursa (job #2917460)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M;
//int v[100010];
int dp[20][200010], ans[20][200010];
int ap[200010];
int logs[200010];
vector<int> e[200010];
int ind = 0;
void df(int l, int n) {
++ind;
ap[n] = ind;
dp[0][ind] = l;
ans[0][ind] = n;
for (auto c : e[n]) {
df(l + 1, c);
++ind;
dp[0][ind] = l;
ans[0][ind] = n;
}
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
f >> N >> M;
//cout << N << M << std::endl;
logs[0] = 0;
for (int i = 2; i <= N; i++) {
int p;
f >> p;
e[p].push_back(i);
//cout << p << std::endl;
}
df(1, 1);
N = ind;
for (int i = 1; i <= N; i++) {
logs[i] = 1 + logs[i/2];
}
for (int l = 2, k = 1; l <= N; l *= 2, k++) {
for (int i = 1; i + l - 1 <= N; i++) {
if (dp[k-1][i] < dp[k-1][i + l / 2]) {
ans[k][i] = ans[k-1][i];
} else {
ans[k][i] = ans[k-1][i + l / 2];
}
dp[k][i] = min(dp[k-1][i], dp[k-1][i + l / 2]);
}
}
for (int i = 1; i <= M; i++) {
int a, b;
f >> a >> b;
//
//cout << a << b;
a = ap[a];
b = ap[b];
if (a > b)
swap(a, b);
//cout << a << ' ' << b << std::endl;
int l = logs[b - a + 1] - 1;
g << min(dp[l][a], dp[l][b - (1 << l) + 1]) << '\n';
}
f.close();
g.close();
return 0;
}