Pagini recente » Cod sursa (job #1209866) | Cod sursa (job #715561) | Cod sursa (job #2454260) | Monitorul de evaluare | Cod sursa (job #2978033)
#include <bits/stdc++.h>
#include <fstream>
#define cin fin
#define cout fout
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int>G[100008];
int v[400008],poz[100008],nvl[100008],m,n,x,cnt,i,j,a,b,aux;
struct element
{
int val,nod;
};
element dp[30][400008];
void dfs(int nod,int nvl2)
{
nvl[nod]=nvl2;
v[++cnt]=nod;
poz[nod]=cnt;
for(auto i:G[nod])
{
if(nvl[i]==0)
{
dfs(i,nvl2+1);
v[++cnt]=nod;
}
}
}
int main()
{
cin>>n>>m;
for(i=2;i<=n;i++)
{
cin>>x;
G[x].push_back(i);
}
dfs(1,1);
for(i=1;i<=cnt;i++)
{
dp[0][i].val=nvl[v[i]];
dp[0][i].nod=v[i];
}
for(i=1;(1<<i)<=cnt;i++)
{
for(j=1;j<=cnt-(1<<i)+1;j++)
{
if(dp[i-1][j].val>dp[i-1][j+(1<<(i-1))].val)
{
dp[i][j]=dp[i-1][j+(1<<(i-1))];
}
else
{
dp[i][j]=dp[i-1][j];
}
}
}
for(i=1;i<=m;i++)
{
cin>>a>>b;
a=poz[a];
b=poz[b];
if(a>b)
swap(a,b);
aux=(int)(log2(b-a+1));
if(dp[aux][a].val>dp[aux][b-(1<<aux)+1].val)
cout<<dp[aux][b-(1<<aux)+1].nod;
else
cout<<dp[aux][a].nod;
cout<<'\n';
}
return 0;
}