Pagini recente » Cod sursa (job #2464525) | Cod sursa (job #1524170) | Cod sursa (job #2250247) | Cod sursa (job #2775809) | Cod sursa (job #1442491)
//O(N + M * RMAX)
//RMAX = O(sqrt(N))
#include <fstream>
#include <cstring>
using namespace std;
static const int MAXN = 100009;
static const int LG = 18;
int n;
int dad[MAXN][LG];
int level[MAXN];
int getLevel(int nod)
{
if(level[nod] == -1)
{
level[nod] = getLevel(dad[nod][0]) + 1;
}
return level[nod];
}
void compute_dads()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < LG; j++)
{
dad[i][j] = dad[dad[i][j - 1]][j - 1];
}
}
}
int main()
{
int m, x, y;
ifstream f("lca.in");
ofstream g("lca.out");
f >> n >> m;
dad[0][1] = 1;
for(int i = 2; i <= n; i++)
{
f >> dad[i][0];
}
memset(level, -1, sizeof(level));
level[1] = 0;
for(int i = 2; i <= n; i++)
{
level[i] = getLevel(i);
}
compute_dads();
for(int i = 0; i < m; i++)
{
f >> x >> y;
if(level[x] > level[y])
{
for(int i = LG - 1; i >= 0; i--)
{
if(level[dad[x][i]] >= level[y])
{
x = dad[x][i];
}
}
}
if(level[y] > level[x])
{
for(int i = LG - 1; i >= 0; i--)
{
if(level[dad[y][i]] >= level[x])
{
y = dad[y][i];
}
}
}
if(x != y)
{
for(int i = LG - 1; i >= 0; i--)
{
if(dad[x][i] != dad[y][i])
{
x = dad[x][i];
y = dad[y][i];
}
}
x = dad[x][0];
y = dad[y][0];
}
g << x << '\n';
}
f.close();
g.close();
return 0;
}