Pagini recente » Cod sursa (job #327595) | Cod sursa (job #1530481) | Cod sursa (job #356895) | Cod sursa (job #3178771) | Cod sursa (job #2950629)
#include <bits/stdc++.h>
using namespace std;
int A[18][100005],level[100005];
vector <int> V[100005];
int sir[200005],cnt=0;
void DFS(int k,int ant)
{
cnt++;
sir[cnt]=k;
for(auto x:V[k])
{
level[x]=level[k]+1;
DFS(x,k);
}
if(k!=ant)
cnt++,sir[cnt]=ant;
}
int rmq[18][200005],lg[200005],poz[100005];
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
ios_base::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
int n,Q,a,b;
fin>>n>>Q;
for(int i=2;i<=n;i++)
{
fin>>A[0][i];
V[A[0][i]].push_back(i);
}
for(int i=2;i<=200000;i++)
lg[i]=lg[i/2]+1;
level[1]=1;
DFS(1,1);
rmq[0][0]=1;
for(int i=1;i<=cnt;i++)
{
if(poz[sir[i]]==0)
poz[sir[i]]=i;
rmq[0][i]=sir[i];
}
for(int i=1;i<=18;i++)
for(int j=1;j<=cnt-(1<<i)+1;j++)
{
if(level[rmq[i-1][j]]<level[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
for(int q=1;q<=Q;q++)
{
fin>>a>>b;
a=poz[a];
b=poz[b];
if(a>b)
swap(a,b);
int dif=b-a+1,val=lg[dif],idk=dif-(1<<val);
if(level[rmq[lg[dif]][a]]<level[rmq[lg[dif]][a+idk]])
fout<<rmq[lg[dif]][a]<<'\n';
else
fout<<rmq[lg[dif]][a+idk]<<'\n';
}
return 0;
}