Pagini recente » Cod sursa (job #2102747) | Cod sursa (job #440173) | Cod sursa (job #2035403) | Cod sursa (job #680749) | Cod sursa (job #2085863)
#include <fstream>
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
const int nmax=1e5;
int n,m,a,b,dp[20][nmax],nivel[nmax];
int lca(int x,int y)
{
if(nivel[x]<nivel[y])
swap(x,y);
if(nivel[x]!=nivel[y])
{
int log=0;
while((1<<(log+1))<=nivel[x]-nivel[y])
log++;
while(log+1)
{
if(nivel[x]-nivel[y]>=(1<<log))
x=dp[log][x];
log--;
}
}
int k=0;
while((1<<(k+1))<=nivel[x])
k++;
if(x==y)
return x;
for(int i=k;i>=0;i--)
if(dp[i][x] && dp[i][y]!=dp[i][x])
{
x=dp[i][x];
y=dp[i][y];
}
return dp[0][x];
}
int main()
{
fi>>n>>m;
dp[0][1]=0;
nivel[1]=1;
for(int i=2;i<=n;i++)
{
fi>>dp[0][i];
nivel[i]=nivel[dp[0][i]]+1;
}
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++)
dp[j][i]=dp[j-1][dp[j-1][i]];
for(int i=1;i<=m;i++)
{
fi>>a>>b;
fo<<lca(a,b)<<"\n";
}
fi.close();
fo.close();
return 0;
}