Cod sursa(job #3138340)

Utilizator cret007Andrei Cret cret007 Data 19 iunie 2023 00:23:32
Problema Lowest Common Ancestor Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>


    int n, m, x, y, *v, *lev;

void level(int node, int curr_lev)
{
    lev[node] = curr_lev;

    for (int i = 1; i <= n; i++)
        if (v[i] == node && !lev[i])
            level(i, curr_lev + 1);

}

int lca(int x, int y)
{
    while (x != y)
        if (lev[x] > lev[y]) {
            x = v[x];
        } else {
            y = v[y];
        }

    return x;
}

int main()
{

    FILE *in = fopen("lca.in", "r");
    FILE *out = fopen("lca.out", "w");

    fscanf(in, "%d%d", &n, &m);
    v = calloc(n + 1, sizeof(int));

    lev = calloc(n + 1, sizeof(int));

    for (int i = 2; i <=n; i++) {
        fscanf(in, "%d", &v[i]);
    }

    level(1, 0);


    for (int i = 0; i < m; i++) {
        fscanf(in, "%d%d", &x, &y);
        fprintf(out, "%d\n", lca(x, y));
    }

    free(v);
    free(lev);
    fclose(in);
    fclose(out);
    return 0;
}