Pagini recente » Cod sursa (job #1765250) | Cod sursa (job #1954729) | Cod sursa (job #355603) | Cod sursa (job #832396) | Cod sursa (job #1674109)
#include<fstream>
#include<vector>
using namespace std;
#define NMAX 100005
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[NMAX];
int n,m,x,y,k,d,E[NMAX],N[NMAX],P[NMAX<<1]={-1},D[20][NMAX<<1];
void dfs(int nod, int niv)
{
D[0][++k]=nod, N[nod]=niv, E[nod]=k;
for (auto fiu: v[nod])
{
dfs(fiu,niv+1);
D[0][++k]=nod, N[k]=niv;
}
}
int main()
{
int i,j;
fin>>n>>m;
for (i=2;i<=n;++i)
{
fin>>x;
v[x].push_back(i);
}
dfs(1,1);
for (i=1;i<=k;++i)
P[i]=1+P[i>>1];
for (i=1;i<=1+P[k];++i)
for (j=1;j<=k;++j)
{
D[i][j]=D[i-1][j];
if (j+(1<<(i-1))<=k && N[D[i][j]]>N[D[i-1][j+(1<<(i-1))]])
D[i][j]=D[i-1][j+(1<<(i-1))];
}
for (i=1;i<=m;++i)
{
fin>>x>>y;
x=E[x], y=E[y];
if (y<x) k=x, x=y, y=k;
d=P[y-x+1];
if (N[D[d][x]]<N[D[d][y-(1<<d)+1]])
fout<<D[d][x]<<"\n";
else
fout<<D[d][y-(1<<d)+1]<<"\n";
}
return 0;
}