Cod sursa(job #1546926)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 8 decembrie 2015 20:49:48
Problema Lowest Common Ancestor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#include <stdlib.h>

int v[100001];
int d[100001];

void depth(int nod){
    if(d[nod]==0){
        depth(v[nod]);
        d[nod]=d[v[nod]]+1;
    }
}

int main()
{
    int n, m, i;
    int u, w, f;
    FILE*fi=fopen("lca.in","r"), *fo=fopen("lca.out","w");
    fscanf(fi,"%d%d", &n, &m);
    f=1;
    for(i=2;i<=n;i++){
        fscanf(fi,"%d", &v[i]);
        if(v[i]!=i-1)
            f=0;
    }

    d[1]=1;
    for(i=2;i<=n;i++)
        depth(i);

    if(f!=1)
        for(i=0;i<m;i++){
            fscanf(fi,"%d%d", &u, &w);
            while(d[u]<d[w])
                w=v[w];
            while(d[w]<d[u])
                u=v[u];
            while(u!=w){
                u=v[u];
                w=v[w];
            }
            fprintf(fo,"%d\n", u);
        }
    else
        for(i=0;i<m;i++){
            fscanf(fi,"%d%d", &u, &w);
            if(u<=w)
                fprintf(fo,"%d\n", u);
            else
                fprintf(fo,"%d\n", w);
        }
    fclose(fi);
    fclose(fo);
    return 0;
}