Pagini recente » Cod sursa (job #3347699) | Cod sursa (job #2111302) | Cod sursa (job #495206) | Borderou de evaluare (job #3296666) | Cod sursa (job #3348574)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int parent[100003];
int rmq[100003][18];
int depth[100003];
int calc(int nod)
{
if (parent[nod]==0)
{
depth[nod]=1;
return 1;
}
if (depth[nod]!=0) return depth[nod];
return depth[nod]=1+calc(parent[nod]);
}
int lca(int x,int y)
{
if (depth[x]<depth[y]) swap(x,y);
int diff=depth[x]-depth[y];
for (int i=16;i>=0;i--)
{
if (diff&(1<<i))
{
x=rmq[x][i];
}
}
if (x==y) return x;
for (int i=16;i>=0;i--)
{
if (rmq[x][i]!=rmq[y][i])
{
x=rmq[x][i];
y=rmq[y][i];
}
}
return rmq[x][0];
}
int main()
{
fin>>n>>m;
for (int i=2;i<=n;i++)
{
fin>>parent[i];
rmq[i][0]=parent[i];
}
for (int j=1;j<=16;j++)
for (int i=1;i<=n;i++)
rmq[i][j]=rmq[rmq[i][j-1]][j-1];
for (int i=1;i<=n;i++)
if (depth[i]==0) calc(i);
while (m--)
{
int x,y;
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
return 0;
}