Pagini recente » Cod sursa (job #818720) | Cod sursa (job #1276868) | Cod sursa (job #2652456) | Cod sursa (job #1139829) | Cod sursa (job #3216589)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
#define NMAX 100008
#define LOGMAX 20
int depth[NMAX],parent[LOGMAX][NMAX],n,m,a,b,i,j;
vector<int>muchii[NMAX];
void dfs (int ad, int node);
void gensparse(int n);
int lca (int x, int y);
int main()
{
fin>>n>>m;
parent[0][1]=1;
for(i=2; i<=n; i++)
{
fin>>a;
muchii[a].push_back(i);
parent[0][i]=a;
}
dfs(1,1);
gensparse(n);
for (i=1; i<=m; i++)
{
fin>>a>>b;
fout<<lca(a,b)<<'\n';
}
return 0;
}
int lca (int x, int y)
{
if (depth[x]<depth[y])
{
swap (x,y);
}
for (int i=LOGMAX-1; i>=0; i--)
{
if (depth[x]-(1<<i)>=depth[y])
{
x=parent[i][x];
}
}
if (x==y)
{
return x;
}
for (int i=LOGMAX-1;i>=0; i--)
{
if (parent[i][x] && parent[i][x]!=parent[i][y] )
{
x=parent[i][x];
y=parent[i][y];
}
}
return parent[0][x];
}
void gensparse (int n)
{
for (int lg=1; lg<LOGMAX; lg++)
{
for (i=1; i<=n; i++)
{
if (parent[lg-1][i])
{
parent[lg][i]=parent[lg-1][parent[lg-1][i]];
}
}
}
}
void dfs (int ad, int node)
{
depth[node]=ad;
for (auto vec : muchii[node])
{
dfs(ad+1,vec);
}
}