Cod sursa(job #2654667)

Utilizator Gliumarin negai Gliu Data 1 octombrie 2020 20:52:53
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("lca.in");
ofstream out("lca.out");
int n,m,x,y,jmp[100005][25],Lev[100005];
int logN;
vector<int>v[100005];
void dfs(int nod,int lev){
	Lev[nod]=Lev[lev]+1;
    jmp[nod][0]=lev;
	for(int i=1;i<log(n);i++)
	  jmp[nod][i]=jmp[jmp[nod][i-1]][i-1];
	       
	for(int i=0;i<v[nod].size();i++){
		int s=v[nod][i];
		if(s==lev)continue;
		  dfs(s,nod);
	}	    
}
int lca(int x,int y){
	if(Lev[x]<Lev[y])
	      swap(x,y);
    
	for(int k=logN;k>=0;k--)
		if(Lev[x]-(1<<k)>=Lev[y])
			x=jmp[x][k];
		
	if(x==y)return x;
	
	for(int k=logN-1;k>=0;k--)
	   if(jmp[x][k] && jmp[x][k] !=jmp[y][k]){
	   	x=jmp[x][k];
	   	y=jmp[y][k];
	   }
	return jmp[x][0];
}

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