Pagini recente » Cod sursa (job #1252115) | Cod sursa (job #1501617) | Cod sursa (job #3161625) | Cod sursa (job #1836702) | Cod sursa (job #1184712)
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int Nmax=100005;
int n,m,a[Nmax],x,y,nivel[Nmax],mat[Nmax][20],logaritm[Nmax];
vector<int>v[Nmax];
inline void Citire()
{
int i,j;
fin>>n>>m;
for (i=2;i<=n;i++)
{
fin>>a[i];
mat[i][0]=a[i];
v[a[i]].push_back(i);
}
for (j=1;j<=19;j++)
for (i=1;i<=n;i++)
mat[i][j]=mat[mat[i][j-1]][j-1];
logaritm[2]=1;
for (i=3;i<=n;i++)
logaritm[i]=logaritm[i>>1]+1;
}
inline void DFS(int x,int niv)
{
int i,len;
nivel[x]=niv;
len=v[x].size();
for (i=0;i< len;i++)
DFS(v[x][i],niv+1);
}
inline void LCA()
{
int i,c,d;
while (m--)
{
fin>>x>>y;
if (nivel[x]>nivel[y]) {c=x;d=y;}
else {c=y;d=x;}
for (i=logaritm[nivel[c]-nivel[d]];i>=0;i--)
if (nivel[mat[c][i]]>=nivel[d])
c=mat[c][i];
if (c!=d)
{for (i=logaritm[nivel[c]];i>=0;i--)
if (mat[c][i]!=mat[d][i])
{
c=mat[c][i];
d=mat[d][i];
}
c=mat[c][0];}
fout<<c<<"\n";
}
}
int main()
{
Citire();
DFS(1,1);
LCA();
return 0;
}