Pagini recente » Cod sursa (job #2039249) | Cod sursa (job #901740) | Cod sursa (job #220746) | Cod sursa (job #2845707) | Cod sursa (job #2285945)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int N = 1e5 + 7;
vector < int > v[N];
int e[2 * N], poz[N], h[N], log[2 * N];
int rl[N][17], ne(0);
void euler(int nod = 1)
{
e[++ne] = nod, poz[nod] = ne;
for (int i : v[nod])
{
h[i] = h[nod] + 1;
euler(i);
e[++ne] = nod;
}
}
void premq() {
for (int i = 0; (1<<i) < 2 * N; ++i)
for (int j = (1<<i); j < (1<<(i + 1)) && j < 2 * N; ++j)
log[j] = i;
for (int i = 1; i <= ne; ++i)
rl[i][0] = e[i];
for (int k = 1; (1<<k) <= ne; ++k)
for (int i = (1<<k); i <= ne; ++i) {
rl[i][k] = rl[i][k - 1];
if (h[rl[i][k - 1]] < h[rl[i - (1<<(k - 1))][k - 1]])
rl[i][k] = rl[i - (1<<(k - 1))][k - 1];
}
}
int lca(int x, int y) {
if (poz[x] > poz[y])
swap(x, y);
x = poz[x];
y = poz[y];
int ll = log[y - x + 1];
int a = rl[y][ll];
int b = rl[x + (1<<ll) - 1][ll];
if (h[a] < h[b])
a = b;
return a;
}
int main()
{
int n, q, t, x, y;
cin >> n >> q;
for (int i = 2; i <= n; ++i) {
cin >> t;
v[t].push_back(i);
}
euler();
premq();
while (q--) {
cin >> x >> y;
cout << lca(x, y) << '\n';
}
return 0;
}