Pagini recente » Cod sursa (job #1805052) | Cod sursa (job #368760) | Cod sursa (job #2142711) | Cod sursa (job #1093542) | Cod sursa (job #3215604)
#include <bits/stdc++.h>
#define L 100005
#define S 18
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q;
int t[S][L], lev[L];
void build_t() {
lev[1] = 1;
for (int bit = 1; bit < S; bit++)
for (int i = 1; i <= n; i++)
t[bit][i] = t[bit - 1][t[bit - 1][i]];
}
int getLev(int node) {
if (lev[node])
return lev[node];
return lev[node] = getLev(t[0][node]) + 1;
}
int getKthParent(int node, int k) {
for (int bit = 0; bit < S; bit++)
if (k & (1 << bit))
node = t[bit][node];
return node;
}
int lca(int x, int y) {
if (getLev(x) < getLev(y))
swap(x, y);
x = getKthParent(x, getLev(x) - getLev(y));
if (x == y)
return x;
for (int bit = S - 1; bit >= 0; bit--)
if (t[bit][x] != t[bit][y]) {
x = t[bit][x];
y = t[bit][y];
}
return t[0][x];
}
int main() {
fin >> n >> q;
for (int i = 2; i <= n; i++)
fin >> t[0][i];
build_t();
for (int i = 1; i <= q; i++) {
int x, y;
fin >> x >> y;
fout << lca(x, y) << "\n";
}
return 0;
}