Pagini recente » Cod sursa (job #1436846) | Cod sursa (job #1671738) | Cod sursa (job #2090239) | Cod sursa (job #2019644) | Cod sursa (job #2739980)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, lgn;
vector<int> G[100001];
int anc[100001][17], dep[100001];
void dfs(int k, int d)
{
dep[k]=d;
for(int x : G[k])
if(dep[x]==0)
dfs(x, d+1);
}
int LCA(int x, int y)
{
if(dep[x]<dep[y])
swap(x, y);
int k=dep[x]-dep[y];
for(int j=lgn; j>=0; j--)
if(k&(1<<j))
x=anc[x][j];
if(x==y)
return x;
for(int j=lgn; j>=0; j--)
if(anc[x][j]!=anc[y][j])
{
x=anc[x][j];
y=anc[y][j];
}
return anc[x][0];
}
int main()
{
int i, j;
fin >> n >> m;
for(i=2; i<=n; i++)
{
fin >> anc[i][0];
G[i].push_back(anc[i][0]);
G[anc[i][0]].push_back(i);
}
lgn=log2(n);
for(j=1; j<=lgn; j++)
for(i=1; i<=n; i++)
anc[i][j]=anc[anc[i][j-1]][j-1];
dfs(1, 1);
for(int k=0; k<m; k++)
{
fin >> i >> j;
fout << LCA(i, j) << '\n';
}
return 0;
}