Pagini recente » Cod sursa (job #2585465) | Cod sursa (job #722657) | Cod sursa (job #2983248) | Cod sursa (job #1908709) | Cod sursa (job #1910259)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define NMAX 100001
using namespace std;
unsigned n, m, maxH = 0, impartire;
unsigned T[NMAX], Tsqrt[NMAX], H[NMAX];
vector<unsigned> Copchi[NMAX];
unsigned lcaSQRT(unsigned i, unsigned j) {
while (Tsqrt[i] != Tsqrt[j]) {
if (H[i] > H[j]) {
i = Tsqrt[i];
} else {
j = Tsqrt[j];
}
}
while (i != j) {
if (H[i] > H[j]) {
i = T[i];
} else {
j = T[j];
}
}
return i + 1;
}
void solveSQRT() {
unsigned i, j;
while (m--) {
cin >> i >> j;
cout << lcaSQRT(i - 1, j - 1) << '\n';
}
}
void preprocessSQRT() {
for (unsigned i = 0; i < n; ++i) {
unsigned lev = H[i] / impartire;
unsigned tatal = T[i];
lev = lev < 1 ? lev : lev - 1;
while (H[tatal] / impartire != lev) {
tatal = T[tatal];
}
Tsqrt[i] = tatal;
}
}
void dfsSQRT(unsigned nod, unsigned tatal) {
if (!(H[nod] % impartire)) {
tatal = T[nod];
}
Tsqrt[nod] = tatal;
for (auto it : Copchi[nod]) {
dfsSQRT(it, tatal);
}
}
void read() {
unsigned tatal;
cin >> n >> m;
T[0] = 0;
H[0] = 0;
for (unsigned i = 1; i < n; ++i) {
cin >> tatal;
--tatal;
T[i] = tatal;
H[i] = H[tatal] + 1;
Copchi[tatal].push_back(i);
maxH = max(maxH, H[i]);
}
impartire = (unsigned) sqrt(maxH);
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
read();
//preprocessSQRT();
dfsSQRT(0, 0);
solveSQRT();
return 0;
}