Pagini recente » Cod sursa (job #881963) | Cod sursa (job #3262160) | Cod sursa (job #2543610) | Cod sursa (job #1407615) | Cod sursa (job #2122071)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
fstream fin("lca.in",ios::in), fout("lca.out",ios::out);
int n,m,niv[100100],dp[20][100100];
vector<int> V[100100];
void dfs(int nod,int nivel)
{
niv[nod]=nivel;
for(auto x: V[nod])
{
dfs(x,nivel+1);
}
}
int salt(int nod,int pas)
{
int pow=0;
while(pas!=0)
{
if((pas&1)==1)
{
//sar cu 2^pow
nod=dp[pow][nod];
}
pow++;
pas=(pas>>1);
}
return nod;
}
int lca(int u,int v)
{
if(niv[u]>niv[v]) swap(u,v);
v=salt(v,(niv[v]-niv[u]));
//aici: niv[u]==niv[v]
int a,b,ind=17;
if(u==v) return u;
while(ind>=0)
{
a=salt(u,(1<<ind));
b=salt(v,(1<<ind));
if(a!=b)
{
u=a;
v=b;
}
ind--;
}
return dp[0][u];
}
int main()
{
int i,j,t,u,v;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>t;
dp[0][i]=t;
V[t].push_back(i);
}
dfs(1,1);
for(i=1;(1<<i)<=n;i++)
{
for(j=2;j<=n;j++)
{
dp[i][j]=dp[i-1][dp[i-1][j]];
}
}
for(i=1;i<=m;i++)
{
fin>>u>>v;
fout<<lca(u,v)<<"\n";
}
}