Pagini recente » Cod sursa (job #3170441) | Cod sursa (job #231847) | Cod sursa (job #1474659) | Cod sursa (job #3223424) | Cod sursa (job #952621)
Cod sursa(job #952621)
#include<fstream>
#include<algorithm>
using namespace std;
int d[100001][18],t[100001],l[100001],i,n,m,j,x,y,z;
int lev(int x)
{
if (l[x]==0)
l[x]=lev(t[x])+1;
return l[x];
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
f >> n >> m;
for (i=2;i<=n;i++)
f >> t[i];
l[1]=1;
for (i=2;i<=n;i++)
if (l[i]==0)
l[i]=lev(i);
for (i=2;i<=n;i++)
d[i][0]=t[i];
for (i=1;i<=n;i++)
for (j=1;j<=17;j++)
d[i][j]=d[d[i][j-1]][j-1];
for (i=1;i<=m;i++)
{
f >> x >> y;
if (l[x]<l[y])
swap(x,y);
z=l[x]-l[y];
for (j=0;j<=17;j++)
if (((1 << j) & z)>0)
x=d[x][j];
if (x==y)
{
g << x << "\n";
continue;
}
for (j=17;j>=0;j--)
if (d[x][j]!=d[y][j])
{
x=d[x][j];
y=d[y][j];
}
g << t[x] << "\n";
}
return 0;
}