Pagini recente » Cod sursa (job #2081170) | Cod sursa (job #3186281) | Cod sursa (job #3247531) | Cod sursa (job #2816768) | Cod sursa (job #1373374)
# include <bits/stdc++.h>
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
int s[123456];
int lg[123456];
int nv[123456];
int dp[123456][22];
int shift(int x,int y)
{
while (y)
{
x = dp[x][lg[y&-y]];
y -= y&-y;
}
return x;
}
int lca(int x,int y)
{
if (nv[x] < nv[y]) y = shift(y,nv[y] - nv[x]);
else x = shift(x,nv[x] - nv[y]);
for (int i=lg[nv[x]];i+1 && x != y;--i)
if (dp[x][i] != dp[y][i])
{
x = dp[x][i];
y = dp[y][i];
}
if (x == y) return x;
x = dp[x][0];
y = dp[y][0];
return x;
}
int main(void)
{
int n,m,x,y;
fi>>n>>m;
for (int i=2;i<=n;++i) lg[i] = lg[i>>1] + 1;
for (int i=2;i<=n;++i) fi>>dp[i][0],nv[i] = nv[dp[i][0]] + 1;
for (int j=1;j<=lg[n];++j)
for (int i=1;i<=n;++i) dp[i][j] = dp[dp[i][j-1]][j-1];
while (m --)
{
fi>>x>>y;
fo << lca(x,y) << '\n';
}
return 0;
}