Pagini recente » Cod sursa (job #2585587) | Cod sursa (job #358545) | Cod sursa (job #711940) | Cod sursa (job #1761272) | Cod sursa (job #2605514)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("lca.in");
ofstream out ("lca.out");
const int L=17;
const int N=100002;
int lst[N],urm[2*N],nr,vf[2*N],ti[N],to[N],timp;
int t[L][N];
void adauga (int x, int y)
{
vf[++nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
void dfs (int nod)
{
ti[nod]=++timp;
for (int p=lst[nod];p!=0;p=urm[p])
{
int y=vf[p];
if (ti[y]==0)
{
dfs(y);
//t[0][y]=nod;
}
}
to[nod]=++timp;
}
int lca (int x, int y)
{
if (ti[x]<=ti[y] && to[y]<=to[x])
return x;
int pas=L-1;
while (pas>=0)
{
int s=t[pas][x];
if (s != 0 && (ti[s]>ti[y] || to[y]>to[s]))
x=s;
pas--;
}
return t[0][x];
}
int main()
{
int n,m,x,y;
in>>n>>m;
for (int i=1;i<n;i++)
{
in>>x;
t[0][i+1]=x;
//adauga (i+1,x);
adauga (x,i+1);
}
dfs (1);
for (int i=1;(1<<i)<=n;i++)
{
for (int j=1;j<=n;j++)
{
t[i][j]=t[i-1][t[i-1][j]];
out << t[i][j] << " ";
}
out << "\n";
}
for (int i=1;i<=m;i++)
{
in>>x>>y;
out<<lca (x,y)<<'\n';
}
return 0;
}