Pagini recente » Cod sursa (job #3142166) | Cod sursa (job #1728646) | Cod sursa (job #1463321) | Cod sursa (job #1589829) | Cod sursa (job #675968)
Cod sursa(job #675968)
#include <fstream>
using namespace std;
ifstream fi ("lca.in");
ofstream fo ("lca.out");
const int dim = 100005, logn = 18;
int T[logn][dim], niv[dim], viz[dim], n, m, a, b;
void cit ()
{
fi >> n >> m;
for (int i = 2; i <= n; i++)
{
fi >> T[0][i];
}
for (int i = 1; i <= logn; i++)
{
for (int j = 1; j <= n; j++)
{
T[i][j] = T[i-1][T[i-1][j]];
}
}
niv[1] = viz[1] = 1;
}
int dfs (int n)
{
if (viz[n] == 0)
{
viz[n] = 1;
niv[n] = dfs (T[0][n]) + 1;
}
return niv[n];
}
int cauta (int a, int b)
{
int x;
if (niv[a] > niv[b])
{ x = a; a = b; b = x; }
x = niv[b] - niv[a];
for (int r = 0; x; r++)
{
if (x & 1)
b = T[r][b];
x >>= 1;
}
if (a == b)
return a;
for (int r = logn-1; r >= 0; r--)
{
if (T[r][a] != T[r][b])
{
a = T[r][a];
b = T[r][b];
}
}
return T[0][a];
}
int main ()
{
cit ();
for (int i = 2; i <= n; i++)
dfs (i);
while ( m-- )
{
fi >> a >> b;
fo << cauta (a, b) << '\n';
}
return 0;
}