Pagini recente » Cod sursa (job #2369437) | Cod sursa (job #67859) | Cod sursa (job #3298673) | Cod sursa (job #96234) | Cod sursa (job #3311511)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nmax=1e5+5;
vector <vector <int> > gr(nmax+1);
int n,q,dp[nmax][35],h[nmax],logg;
void dfs(int nod, int parent)
{
dp[nod][0]=parent;
for (int v:gr[nod] )
{
h[v]=h[nod]+1;
dfs(v,nod);
}
}
int lca(int x, int y)
{
if ( h[x]<h[y] )
swap(x,y);
int dif=h[x]-h[y];
for (int i=logg; i>=0; i-- )
if ( dif&(1<<i) ) {
dif-=(1<<i);
x=dp[x][i];
}
if ( x==y ) return x;
for (int i=logg; i>=0; i-- )
{
if ( dp[x][i]!=-1 && dp[x][i]!=dp[y][i] )
{
x=dp[x][i];
y=dp[y][i];
}
}
return dp[x][0];
}
int main()
{
f >> n >> q;
logg=floor(log2(n))+1;
for (int i=2; i<=n; i++ )
{
int x; f >> x;
gr[x].push_back(i);
}
dfs(1,-1);
for (int j=1; j<=logg; j++ )
for (int i=1; i<=n; i++ )
if ( dp[i][j-1]!=-1 )
dp[i][j]=dp[dp[i][j-1]][j-1];
else dp[i][j]=-1;
while ( q-- )
{
int x,y; f >> x >> y;
g << lca(x,y) << '\n';
}
return 0;
}