Pagini recente » Cod sursa (job #2925305) | Cod sursa (job #413447) | Cod sursa (job #1330041) | Cod sursa (job #104391) | Cod sursa (job #2656550)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
struct nod
{
int info;
nod * urm;
}*vecin[100001];
nod * prim[100001];
int lev[100001];
int t[17][1000001];
void DFS(int x, int lvl)
{
lev[x]=lvl;
nod * t = prim[x];
while(t!=NULL)
{
DFS(t->info, lvl+1);
t=t->urm;
}
}
int lca(int x,int y)
{
int i, log1, log2;
if(lev[x]<lev[y])
{
swap(x, y);
}
for(log1=1; (1<<log1)<lev[x]; log1++);
for(log2=1; (1<<log2)<lev[y]; log2++);
//il aduc pe x la nivelul lui y
for(i=log1; i>=0; i--)
{
if(lev[x]-(1<<i)>=lev[y])
{
x=t[i][x];
}
}
if(x==y) return x;
for(i=log2; i>=0; i--)
{
if(t[i][y] && t[i][x]!=t[i][y])
{
x=t[i][x];
y=t[i][y];
}
}
return t[0][x];
}
int main()
{
int n, m, i, j, logn;
fin>>n>>m;
for(i=2; i<=n; i++)
{
fin>>t[0][i];
//il adaug pe i la fiii lui t[0][i];
nod * aux = new nod;
aux->info=i;
aux->urm=NULL;
if(prim[ t[0][i] ]==NULL)
{
prim[ t[0][i] ]=aux;
vecin[ t[0][i] ]=aux;
}
else
{
vecin[ t[0][i] ]->urm=aux;
vecin[ t[0][i] ]=aux;
}
}
for(logn=1; (1<<logn)<n; logn++);
for(i=1; i<=logn; i++)
{
for(j=1; j<=n; j++)
{
t[i][j]=t[i-1][ t[i-1][j] ];
}
}
DFS(1, 0);
for(i=1; i<=m; i++)
{
int x, y;
fin>>x>>y;
fout<<lca(x, y) <<"\n";
}
}