Pagini recente » Cod sursa (job #1107342) | Cod sursa (job #2972717) | Cod sursa (job #2907198) | Cod sursa (job #326482) | Cod sursa (job #3003455)
#include <bits/stdc++.h>
using namespace std;
fstream fin("lca.in",ios::in),fout("lca.out",ios::out);
int n,q;
int an[int(1e5)+1][19];
int lvl[int(1e5)+1];
vector<int> v[int(1e5)+1];
void dfs(int nod,int parent)
{
lvl[nod] = lvl[parent]+1;
for(int &i:v[nod])
{
if(i!=parent)
{
dfs(i,nod);
}
}
}
int lca(int x,int y)
{
if(lvl[x]<lvl[y])
swap(x,y);
int diff = lvl[x]-lvl[y];
for(int h=18;h>=0;h--)
{
if(diff & (1<<h))
{
x = an[x][h];
}
}
if(x == y)
{
return x;
}
for(int h=18;h>=0;h--)
{
if(an[x][h] != an[y][h])
{
x = an[x][h];
y = an[y][h];
}
}
return an[x][0];
}
int main()
{
fin>>n>>q;
for(int i=2;i<=n;i++)
{
int nod;
fin>>nod;
an[i][0] = nod;
v[nod].push_back(i);
v[i].push_back(nod);
}
dfs(1,0);
for(int j=1;j<=18;j++)
{
for(int i=1;i<=n;i++)
{
an[i][j] = an[an[i][j-1]][j-1];
}
}
while(q--)
{
int x,y;
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
return 0;
}