Pagini recente » Cod sursa (job #2599206) | Cod sursa (job #1849266) | Cod sursa (job #1405987) | Cod sursa (job #2982855) | Cod sursa (job #2886219)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int NMAX = 1e5+5;
const int KMAX = 2e5+5;
int k, euler[KMAX], niv[NMAX], firstap[NMAX], rmq[20][KMAX], logg2[KMAX];
vector<int> v[NMAX];
void dfs(int nod, int h) {
k++;
euler[k] = nod;
niv[nod] = h;
firstap[nod] = k; ///mereu prima aparitie e aici
for (int fiu : v[nod]) {
dfs(fiu, h + 1);
k++;
euler[k] = nod;
// niv[k] = h;
}
}
int main() {
int n, m;
fin >> n >> m;
for (int i = 2; i <= n; i++) {
int x;
fin >> x;
v[x].push_back(i);
}
dfs(1, 0);
/*
for (int i = 1; i <= k; i++)
fout << euler[i] << " ";
fout << "\n";
for (int i = 1; i <= k; i++)
fout << niv[i] << " ";
*/
for (int i = 2; i <= max(n, k); i++)
logg2[i] = logg2[i / 2] + 1;
for (int j = 1; j <= k; j++)
rmq[0][j] = euler[j];
for (int j = 1; j <= k; j++) {
for (int i = 1; (1 << i) <= j; i++) {
if (niv[rmq[i - 1][j - (1 << (i - 1))]] < niv[rmq[i - 1][j]])
rmq[i][j] = rmq[i - 1][j - (1 << (i - 1))];
else
rmq[i][j] = rmq[i - 1][j];
}
}
for (int qq = 1; qq <= m; qq++) {
int x, y;
fin >> x >> y;
int a = firstap[x];
int b = firstap[y];
if (a > b)
swap(a, b);
int l = logg2[b - a + 1];
int rez;
if (niv[rmq[l][a + (1 << l) - 1]] < niv[rmq[l][b]])
rez = rmq[l][a + (1 << l) - 1];
else
rez = rmq[l][b];
fout << rez << "\n";
}
return 0;
}