Cod sursa(job #2654911)

Utilizator Gliumarin negai Gliu Data 2 octombrie 2020 19:50:10
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,x,y,tout[100009],tin[100009],t,jmp[100009][25];
vector <int>v[100009];
ifstream in("lca.in");
ofstream out("lca.out");
void dfs(int nod,int dad){
	tin[nod]=++t;
	jmp[nod][0]=dad;
	for(auto it:v[nod]){
		if(it == nod)continue;
		dfs(it,nod);
	}
	tout[nod]=++t;
}
bool my_daddy(int x,int y){
	if(tin[x]<=tin[y] && tout[x]>=tout[y])return 1;
	return 0;
}

int lca(int x,int y){
	if(my_daddy(x,y))return x;
	if(my_daddy(y,x))return y;
	for(int i=20;i>=20;i--){
		if(!my_daddy(jmp[x][i],y) && jmp[x][i])x=jmp[x][i];
	}
	return jmp[x][0];
}
int main(){
in >>n>>m;
for(int i=2;i<=n;i++){
	in >>x;
	v[x].push_back(i);
}
dfs(1,0);
while(m--){
	in >>x>>y;
	out <<lca(x,y)<<"\n";
}
return 0;
}