Cod sursa(job #1801262)

Utilizator rares1012Rares Cautis rares1012 Data 8 noiembrie 2016 20:11:44
Problema Lowest Common Ancestor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <stdlib.h>

int st[100001][17];
int dist[100001];

int main()
{
    int n,k,i,j,a,b,p;
    FILE*fi,*fo;
    fi=fopen("lca.in","r");
    fo=fopen("lca.out","w");
    fscanf(fi,"%d%d",&n,&k);
    st[1][0]=1;
    for(i=1;i<n;i++)
        {
            fscanf(fi,"%d",&st[i+1][0]);
        }
    for(i=1;i<=n;i++)
        {
            for(j=1;j<17;j++)
                st[i][j]=st[st[i][j-1]][j-1];
        }
    dist[1]=0;
    for(i=2;i<=n;i++)
        {
            dist[i]=dist[st[i][0]]+1;
        }
    for(i=0;i<k;i++)
        {
            fscanf(fi,"%d%d",&a,&b);
            if(dist[a]>dist[b])
            {
                a=a+b;
                b=a-b;
                a=a-b;
            }
            p=16;
            while(p>=0 && dist[a]<dist[b])
                {
                    if(dist[st[b][p]]>=dist[a])
                    {
                        b=st[b][p];
                    }
                    p--;
                }
            if(a==b)
                fprintf(fo,"%d\n",a);
            else {
                p=16;
                while(p>=0)
                {
                    if(st[a][p]!=st[b][p])
                    {
                        a=st[a][p];
                        b=st[b][p];
                    }
                    p--;
                }
                fprintf(fo,"%d\n",st[a][0]);
            }
        }
    fclose(fi);
    fclose(fo);
    return 0;
}