Pagini recente » Cod sursa (job #1635034) | Cod sursa (job #3262930) | Cod sursa (job #545042) | Cod sursa (job #3264133) | Cod sursa (job #3293038)
#include <fstream>
#include <iostream>
#include<vector>
using namespace std;
#define bsize 20
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int>> graph;
vector<vector<int>> vparent;
vector<int> depth;
void dfs(int p,int u,int d){
depth[u]=d;
for(int i=1;i<bsize;i++){
vparent[u][i]=vparent[vparent[u][i-1]][i-1];
}
for(auto v:graph[u]){
if(v==p)
continue;
dfs(u,v,d+1);
}
}
int lca(int u,int v){
if(depth[u]<depth[v])
swap(u,v);
int nr=depth[u]-depth[v],i;
for(i=0;i<bsize;i++){
if(nr&(1<<i)){
u=vparent[u][i];
nr-=(1<<i);
}
if(nr==0)
break;
}
if(u==v)
return u;
for(i=bsize-1;i>=0;i--){
if(vparent[u][i]!=vparent[v][i]){
u=vparent[u][i];
v=vparent[v][i];
}
}
return vparent[u][0];
}
int main()
{
int i,j,n,m,u,v;
fin>>n>>m;
graph.resize(n+1);
depth.resize(n+1,0);
vparent = vector<vector<int>>(n+1,vector<int>(bsize,1));
for(i=2;i<=n;i++){
fin>>u;
vparent[i][0]=u;
graph[u].push_back(i);
}
dfs(-1,1,1);
for(i=0;i<m;i++){
fin>>u>>v;
fout<<lca(u,v)<<"\n";
}
return 0;
}