Pagini recente » Cod sursa (job #570292) | Cod sursa (job #748343) | Cod sursa (job #2485210) | Cod sursa (job #708824) | Cod sursa (job #2605519)
#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, t[L][N];
void adauga (int x, int y)
{
vf[++nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
void dfs(int x)
{
ti[x] = ++timp;
for(int p = lst[x]; p != 0; p = urm[p])
{
int y = vf[p];
if(ti[y] == 0)
dfs(y);
}
to[x] = ++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 (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]];
}
}
for (int i=1;i<=m;i++)
{
in>>x>>y;
out<<lca (x,y)<<'\n';
}
return 0;
}