Pagini recente » Cod sursa (job #2491746) | Cod sursa (job #3144450) | Cod sursa (job #319618) | Cod sursa (job #2117424) | Cod sursa (job #1442480)
#include <fstream>
#include <cstring>
using namespace std;
static const int MAXN = 100009;
static const int RMAX = 300;
int n;
int dad[MAXN];
int rdad[MAXN];
int level[MAXN];
int getLevel(int nod)
{
if(level[nod] == -1)
{
level[nod] = getLevel(dad[nod]) + 1;
}
return level[nod];
}
int main()
{
int m, x, y;
ifstream f("lca.in");
ofstream g("lca.out");
f >> n >> m;
dad[1] = 1;
for(int i = 2; i <= n; i++)
{
f >> dad[i];
}
memset(level, -1, sizeof(level));
level[1] = 0;
for(int i = 1; i <= n; i++)
{
level[i] = getLevel(i);
}
for(int i = 1; i <= n; i++)
{
int father = dad[i];
while(level[father] % RMAX != 0)
{
father = dad[father];
}
rdad[i] = father;
}
for(int i = 0; i < m; i++)
{
f >> x >> y;
while(rdad[x] != rdad[y])
{
if(level[x] == level[y])
{
x = rdad[x];
y = rdad[y];
}
else if(level[x] > level[y])
{
x = rdad[x];
}
else if(level[y] > level[x])
{
y = rdad[y];
}
}
while(x != y)
{
if(level[x] == level[y])
{
x = dad[x];
y = dad[y];
}
else if(level[x] > level[y])
{
x = dad[x];
}
else if(level[y] > level[x])
{
y = dad[y];
}
}
g << x << '\n';
}
f.close();
g.close();
return 0;
}