Pagini recente » Cod sursa (job #1158293) | Cod sursa (job #1430612) | Cod sursa (job #1063633) | Cod sursa (job #78393) | Cod sursa (job #2455067)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int dim = 100005;
int n,m,st[20][dim],lv[dim];
vector <int> vec[dim];
void dfs(int nod,int lev)
{
lv[nod] = lev;
for (int i=0; i<vec[nod].size(); i++)
{
dfs(vec[nod][i], lev+1);
}
}
int main()
{
in >> n >> m;
for (int i=2; i<=n; i++)
{
in >> st[0][i];
vec[st[0][i]].push_back(i);
}
dfs(1,0);
for (int j=1; j<=18; j++)
{
for (int i=1; i<=n; i++)
{
st[j][i] = st[j-1][st[j-1][i]];
}
}
int log1,log2,x,y;
for (int i=1; i<=m; i++)
{
in >> x >> y;
if (lv[x] < lv[y])
{
swap(x,y);
}
for (log1=1; (1<<log1) < lv[x]; log1++);
for (log2=1; (1<<log2) < lv[y]; log2++);
for (int j=log1; j>=0; j--)
{
if (lv[x] - (1<<j) >= lv[y])
{
x = st[j][x];
}
}
if (x == y)
{
out << x << "\n";
}
else
{
for (int j=log2; j>=0; j--)
{
if (st[j][x] && st[j][x] != st[j][y])
{
x = st[j][x];
y = st[j][y];
}
}
out << st[0][x] << "\n";
}
}
return 0;
}