Cod sursa(job #2768777)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 12 august 2021 09:41:33
Problema Lowest Common Ancestor Scor 70
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include<stdio.h>
#define N 100001
int n,m,x,y,i,j,a[N],p[N][20],l[N];
int main()
{
	freopen("lca.in","r",stdin),freopen("lca.out","w",stdout),scanf("%d%d",&n,&m),l[1]=1;
	for(i=2;i<=n;++i)
       	scanf("%d",a+i),l[i]=l[a[i]]+1,p[i][0]=a[i];
	for(i=0;i<=n;++i)
        for(j=1;j<19;++j)
            p[i][j]=-1;
	for(j=1;j<19;++j)
        for(i=0;i<=n;++i)
            if(p[i][j-1]!=-1)
                p[i][j]=p[p[i][j-1]][j-1];
	while(m--) {
		scanf("%d%d",&x,&y);
       	if(l[x]<l[y])
            i=x,x=y,y=i;
       	for(j=1;(1<<j)<=l[x];++j);
       	for(i=--j;i>=0;--i)
            if(l[x]-(1<<i)>=l[y])
                x=p[x][i];
       	if(x==y)
            printf("%d\n",x);
       	else {
		   	for(i=j;i>=0;--i)
                if(p[x][i]!=-1&&p[x][i]!=p[y][i]&&p[y][i]!=-1)
                    x=p[x][i],y=p[y][i];
            printf("%d\n",a[x]);
		}
	}
	return 0;
}