Cod sursa(job #1985305)

Utilizator rares1012Rares Cautis rares1012 Data 27 mai 2017 13:46:34
Problema Lowest Common Ancestor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <stdlib.h>

int t[100001][17],f[100001][2],lst[100001],in[100001],ie[100001];

int nr=1;

void fn(int nod)
{
    int x=lst[nod];
    in[nod]=nr;
    nr++;
    while(f[x][0]!=0)
    {
        fn(f[x][0]);
        x=f[x][1];
    }
    ie[nod]=nr;
    nr++;
}

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