Cod sursa(job #1547177)

Utilizator mihai.alphamihai craciun mihai.alpha Data 9 decembrie 2015 06:40:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>

int v[100001];
int a[100001];

void adinc(int noduri){
    if(a[noduri]==0){
        adinc(v[noduri]);
        a[noduri]=a[v[noduri]]+1;
    }
}

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

    a[1]=1;
    for(i=2;i<=n;i++)
        adinc(i);

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