Cod sursa(job #2285335)

Utilizator mirunazMiruna Zavelca mirunaz Data 18 noiembrie 2018 14:33:31
Problema Lowest Common Ancestor Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>

void read(FILE *in, int t[], int p[], int l[], int n)
{
    int i, s = sqrt(n);
    l[1] = 0; p[1] = 1; t[1] = 0;
    for(i = 2; i <= n; i ++) {
        fscanf(in, "%d", &t[i]);
        l[i] = l[t[i]] + 1;

        if(l[i] < s) {
            p[i] = 1;
        }
        else {
            if(l[i]%s == 0) {
                p[i] = t[i];
            }
            else {
                p[i] = p[t[i]];
            }
        }
    }
}

int query(FILE *in, int t[], int p[], int l[])
{
    int x, y;
    fscanf(in, "%d %d", &x, &y);

    while(p[x] != p[y]) {
        if(l[x] > l[y]) {
            x = p[x];
        }
        else {
            y = p[y];
        }
    }

    while(x != y) {
        if(l[x] > l[y]) {
            x = t[x];
        }
        else {
            y = t[y];
        }
    }

    return x;
}

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

    int n, m;
    fscanf(in, "%d %d", &n, &m);

    int t[n+1], p[n+1], l[n+1];
    read(in, t, p, l, n);

    while (m) {
        fprintf(out, "%d\n", query(in, t, p, l));
        m --;
    }

    fclose(in);
    fclose(out);
    return 0;
}