Pagini recente » Cod sursa (job #2301930) | Cod sursa (job #415724) | Cod sursa (job #2328075) | Istoria paginii runda/123456789101112/clasament | Cod sursa (job #2858233)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int i,j,n,m,k,x,y,r,l;
int niv[400005],d[400005][20],e[400005],poz[400005];
vector<int>v[100005];
void dfs(int nod, int nivel)
{
niv[++k]=nivel;
e[k]=nod;
if(!poz[nod])poz[nod]=k;
for(int i=0; i<v[nod].size(); i++)
{
dfs(v[nod][i],nivel+1);
niv[++k]=nivel;
e[k]=nod;
}
}
void rmq()
{
for(i=1; i<=k; i++)
{
d[i][0] = i;
}
for(i=1; (1<<i)<=k; i++)
{
int l=1<<i;
for(j=1; l+j<=k; j++)
{
if(niv[d[j][i-1]]<niv[d[j+l/2][i-1]])
d[j][i]=d[j][i-1];
else d[j][i]=d[j+l/2][i-1];
}
}
}
int main()
{
fin>>n>>m;
for(i=2; i<=n; i++)
{
fin>>x;
v[x].push_back(i);
}
dfs(1,0);
rmq();
for(i=1; i<=m; i++)
{
fin>>x>>y;
x=poz[x];
y=poz[y];
if(x>y)swap(x,y);
l=log2(y-x+1);
if(niv[d[x][l]]<niv[d[y-(1<<l)+1][l]])
r=d[x][l];
else r=d[y-(1<<l)+1][l];
fout<<e[r]<<'\n';
}
return 0;
}