Pagini recente » Cod sursa (job #619090) | Cod sursa (job #804430) | Cod sursa (job #1537759) | Cod sursa (job #2093689) | Cod sursa (job #2121107)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int maxn = 100005;
const int maxk = 20;
int n, m, dad[maxn], deep[maxn], dp[maxk][maxn],f,l;
vector <int> g[maxn];
int stramos(int p,int q)
{
for(int bit=0;bit<maxk;++bit)
{
if(p &(1<<bit))
q=dp[bit][q];
}
return q;
}
int lca(int x,int y)
{
if(deep[x]<deep[y])
return lca(y,x);
//deep[x]>deep[y];
x=stramos(deep[x]-deep[y],x);
if(x==y)
return x;
for(int k=maxk-1;k>=0;k--)
{
if(dp[k][x]!=dp[k][y]){
x=dp[k][x];
y=dp[k][y];}
}
return dp[0][x];
}
void dfs(int nod)
{
for(int y=0;y<g[nod].size();y++)
{
deep[g[nod][y]]=deep[nod]+1;
dfs(g[nod][y]);
}
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>dp[0][i];
g[dp[0][i]].push_back(i);
}
deep[1]=1;
dfs(1);
//1<<i <= log2(n) <=> 1<=2^i<=n
for(int i=1;i<maxk;++i)
for(int j=1;j<=n;j++)
{
dp[i][j]=dp[i-1][dp[i-1][j]];
}
for(int i=1;i<=m;i++)
{
fin>>f>>l;
fout<<lca(f,l)<<'\n';
}
return 0;
}