Cod sursa(job #588442)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 mai 2011 23:37:42
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream.h>
#define N 100001
long n,m,a[N],x,y,i,j,p[N][20],l[N];
long lca(long n,long p[N][20],long a[N],long l[N],long x,long y)
{long i,t,lg;
if(l[x]<l[y])
      t=x,x=y,y=t;
for(lg=1;(1<<lg)<=l[x];lg++);
lg--;
for(i=lg;i>=0;i--)
if(l[x]-(1<<i)>=l[y])
      x=p[x][i];
if(x==y)
      return x;
for(i=lg;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];
return a[x];}
int main()
{ifstream f("lca.in");
freopen("lca.out","w",stdout);
f>>n>>m;
l[1]=1;
for(i=2;i<=n;i++)
       {f>>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--)
       {f>>x>>y;
       printf("%ld\n",lca(n,p,a,l,x,y));}
f.close();
fclose(stdout);
return 0;}