Pagini recente » Cod sursa (job #2074174) | Cod sursa (job #22492) | Cod sursa (job #795785) | Cod sursa (job #1120865) | Cod sursa (job #3227112)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define dim 100001
struct nod
{
int t,h=0;
};
vector<nod> v;
int dp[22][dim];
void Egalare(int &x,int &y)
{
bool sem;
sem=0;
if(v[x].h>v[y].h)
{
swap(x,y);
sem=1;
}
int dif,nod,i;
dif=v[y].h-v[x].h;
i=20;
nod=y;
while(dif>0)
{
while((1<<i)>dif)
i--;
nod=dp[i][nod];
dif-=(1<<i);
}
y=nod;
if(sem==1)
{
swap(x,y);
}
}
int Stramos(int x,int y)
{
if(x==y)
return x;
int i=20,nod1=x,nod2=y;
while(i>=0)
{
if(dp[i][nod1]==dp[i][nod2])
i--;
else
{
nod1=dp[i][nod1];
nod2=dp[i][nod2];
}
}
return v[nod1].t;
}
int main()
{
int n,m,i,j,x,y,niv;
fin>>n>>m;
v.resize(n+1);
for(i=2;i<=n;i++)
{
fin>>x;
v[i].t=x;
v[i].h=v[x].h+1;
dp[0][i]=x;
}
niv=0;
while((1<<niv)<=n)
{
niv++;
}
niv--;
for(i=1;i<=niv;i++)
{
for(j=1;j<=n;j++)
{
dp[i][j]=dp[i-1][dp[i-1][j]];
}
}
for(i=0;i<m;i++)
{
fin>>x>>y;
if(v[x].h!=v[y].h)
{
Egalare(x,y);
}
fout<<Stramos(x,y)<<'\n';
}
return 0;
}