Pagini recente » Cod sursa (job #851669) | Cod sursa (job #555426) | Cod sursa (job #282147) | Cod sursa (job #1599246) | Cod sursa (job #2922994)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int NMAX=1e5+5;
const int NMAX1=20;
vector<int>v[NMAX];
int t[NMAX1][NMAX];
int ti[NMAX];
int to[NMAX];
int lev[NMAX];
int kon;
bool ancestor(int x,int y)
{
return ti[x]<=ti[y] && to[x]>=to[y];
}
void dfs(int x)
{
ti[x]=++kon;
for(auto i:v[x])
dfs(i);
to[x]=++kon;
}
int lca(int x,int y)
{
int i,j;
if(ancestor(x,y))
return x;
else
{
for(i=lev[x];i>=0;i--)
{
if(t[i][x]!=0 && ancestor(t[i][x],y)==0)
x=t[i][x];
}
return t[0][x];
}
}
int main()
{
int n,m,i,j,l,e,x,y;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>t[0][i];
v[t[0][i]].push_back(i);
}
l=(int(log2(n)));
for(e=1;e<=l;e++)
{
for(i=1;i<=n;i++)
{
t[e][i]=t[e-1][t[e-1][i]];
if(t[e][i]!=0)
lev[i]=e;
}
}
dfs(1);
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}