Cod sursa(job #1985282)

Utilizator rares1012Rares Cautis rares1012 Data 27 mai 2017 13:28:59
Problema Lowest Common Ancestor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.01 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++){
        j=1;
        while(t[t[i][j-1]][j-1]!=0){
            t[i][j]=t[t[i][j-1]][j-1];
            j++;
        }
    }
    for(i=0;i<q;i++){
        fscanf(fi,"%d%d",&a,&b);
        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;
}