Cod sursa(job #765490)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 iulie 2012 22:36:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<cstdio>
int n,m,a[100001],x,y,i,j,p[100001][20],l[100001],g,t;
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;
for(i=0;i<=n;i++)
for(j=1;j<=18;j++)
       p[i][j]=-1;
for(i=1;i<=n;i++)
       p[i][0]=a[i];
for(j=1;j<=18;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])
             t=x,x=y,y=t;
       for(g=1;(1<<g)<=l[x];g++);
       g--;
       for(i=g;i>=0;i--)
       if(l[x]-(1<<i)>=l[y])
             x=p[x][i];
       if(x==y)
             printf("%d\n",x);
       else
             {for(i=g;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;}