Pagini recente » Cod sursa (job #719287) | Cod sursa (job #2715551)
#include <bits/stdc++.h>
using namespace std;
ifstream r("lca.in");
ofstream w("lca.out");
int n, m, stramos[20][100003], adancime[100003];
vector<int>g[100003];
void dfs(int nod, int niv){
for(auto it: g[nod]){
dfs(it, niv+1);
adancime[it]=niv;
}
}
void init() {
int log= log2(n) + 1;
for(int i = 1; i <= log; i++) {
for(int j = 1; j <= n; j++) {
stramos[i][j] = stramos[i - 1][stramos[i - 1][j]];
}
}
}
void niv(int &a, int &b) {
if(adancime[a] < adancime[b]) {
swap(a, b);
}
int dist = adancime[a] - adancime[b];
for(int j = 0; j <= log2(n) + 1; j++) {
if(dist & (1 << j)) {
a = stramos[j][a];
}
}
}
int lca(int a, int b) {
if(a == b) {
return a;
}
for(int j=log2(n)+1;j >= 0;j--) {
if(stramos[j][a] != stramos[j][b]&&stramos[j][a]) {
a = stramos[j][a];
b = stramos[j][b];
}
}
return stramos[0][a];
}
int main()
{
r>>n>>m;
stramos[0][1]=1;
for(int i=2;i<=n;i++){
r>>stramos[0][i];
g[stramos[0][i]].push_back(i);
}
dfs(1, 0);
init();
while(m--){
int a, b;
r>>a>>b;
niv(a, b);
w<<lca(a, b)<<"\n";
}
return 0;
}