Pagini recente » Cod sursa (job #975835) | Cod sursa (job #823042) | Cod sursa (job #2315746) | Cod sursa (job #2586259) | Cod sursa (job #3164313)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define dim1 22
#define dim2 100001
struct nod
{
int t,h=0;
};
vector<nod> v;
int dp[dim1][dim2];
void Niv(int &a,int &b)
{
bool sem=0;
if(v[a].h>v[b].h)
swap(a,b),sem=1;
//a e mai sus decat b
int k=v[b].h-v[a].h,nod=b;
int i=20;
while(k>0)
{
while((1<<i)>k)
i--;
nod=dp[i][nod];
k-=(1<<i);
}
b=nod;
if(sem==1)
swap(a,b);
}
int StrCom(int a,int b)
{
if(a==b)
return a;
int i=20,n1=a,n2=b;
while(i>=0)
{
if(dp[i][n1]==dp[i][n2])
i--;
else
{
n1=dp[i][n1];
n2=dp[i][n2];
}
}
return v[n1].t;
}
int main()
{
int n,m,j,nr,i,k=0,a,b;
fin>>n>>m;
v.resize(n+1);
for(i=2;i<=n;i++)
{
fin>>nr;
v[i].t=nr;
v[i].h=v[nr].h+1;
dp[0][i]=nr;
}
while((1<<k)<=n)
k++;
k--;
for(i=1;i<=k;i++)
{
for(j=1;j<=n;j++)
{
dp[i][j]=dp[i-1][dp[i-1][j]];
}
}
for(i=0;i<m;i++)
{
fin>>a>>b;
if(v[a].h!=v[b].h)
{
Niv(a,b);
}
fout<<StrCom(a,b)<<'\n';
}
return 0;
}