Cod sursa(job #2654932)

Utilizator Gliumarin negai Gliu Data 2 octombrie 2020 20:38:58
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("lca.in");
ofstream out("lca.out");

const int N=(1<<5)+11;
int n,m,jmp[N][50],tin[N],tout[N],t;
vector <int> v[N];

dfs(int nod,int dadd){
	tin[nod]= ++t;
	jmp[nod][0]= dadd;
	
	for(auto it: v[nod]){
		if(it == dadd)continue;
		dfs(it,nod);
	}
	
	tout[nod]= ++t;
}

bool my_dad(int dadd,int x){
	if(tin[dadd]<=tin[x] && tout[x] <= tout[dadd])return 1;
	return 0;
}

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

for(int jj=1,x,y;jj<=m;jj++){
	in >>x>>y;
	
	out <<lca(x,y)<<'\n';
}
   
return 0;
}