Pagini recente » Cod sursa (job #2825257) | Cod sursa (job #782237) | Cod sursa (job #582009) | Cod sursa (job #2132109) | Cod sursa (job #2908417)
#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=18;
int t[NMAX1][NMAX];
int ti[NMAX],to[NMAX];
int emax[NMAX];
int timp;
vector <int> fii[NMAX];
bool este_stramos(int x, int y)
{
return(ti[x]<=ti[y] && to[y]<=to[x]);
}
int lca(int x, int y)
{
int e,i,j;
if(este_stramos(x, y))
return x;
for(e=emax[x];e>=0;e--)
if(t[e][x] != 0 && !este_stramos(t[e][x], y))
x=t[e][x];
return t[0][x];
}
void dfs(int x)
{
ti[x]=++timp;
for (auto y: fii[x])
dfs(y);
to[x]=++timp;
}
int main()
{
int n,m,i,j,x,y,e;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>t[0][i];
fii[t[0][i]].push_back(i);
}
int lung;
lung=(int(log2(n)));
for(e=1;e<=lung;e++)
{
for(i=1;i<=n;i++)
{
t[e][i]=t[e-1][t[e-1][i]];
if (t[e][i]!=0)
emax[i] = e;
}
}
dfs(1);
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}