Pagini recente » Cod sursa (job #3180295) | Cod sursa (job #434458) | Cod sursa (job #2349734) | Cod sursa (job #297710) | Cod sursa (job #1081113)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
#define N_max 100010
#define L_max 20
int n,m;
int Arb[L_max][N_max],Lg[N_max],Niv[N_max];
vector <int> A[N_max];
void read()
{
f>>n>>m;
for (int i=2;i<=n;i++)
{
f>>Arb[0][i];
A[Arb[0][i]].push_back(i);
}
int k;
for (k=1; (1<<k)<=n;++k)
for (int i=1;i<=n;i++)
Arb[k][i]=Arb[k-1][Arb[k-1][i]];
}
void df(int nod, int niv)
{
Niv[nod]=niv;
vector<int>::iterator it;
for(it=A[nod].begin();it!=A[nod].end();++it)
df(*it,niv+1);
}
int lca(int x, int y)
{
if (Niv[x]<Niv[y])
swap(x,y);
int log1, log2;
for(log1=1;(1<<log1)<=Niv[x];++log1);
for(log2=1;(1<<log2)<=Niv[y];++log2);
for(int k=log1;k>=0;--k)
if(Niv[x]-(1<<log1)>=Niv[y])
x=Arb[k][x];
if(x==y)
return x;
for (int k=log2;k>=0;--k)
if(Arb[k][x] && Arb[k][x]!=Arb[k][y])
{
x=Arb[k][x];
y=Arb[k][y];
}
return Arb[0][x];
}
int main()
{
read();
df(1,0);
while(m>0)
{
int a,b;
f>>a>>b;
g<<lca(a,b)<<'\n';
m--;
}
f.close();
g.close();
return 0;
}