Cod sursa(job #1804723)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 12 noiembrie 2016 21:54:08
Problema Lowest Common Ancestor Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <math.h>
#define MAXN 100000
#define MAXL 20
int tata[MAXN],euler[4 * MAXN],M2[MAXN][MAXL],level[4 * MAXN],poz[MAXN],n,m;

void euleer(int nod){

    int i;
    ++m;
    euler[m] = nod;
    level[m] = level[m - 1] + 1;
    poz[nod] = m;


    for(i = 1;i <= n; ++i){
        if(tata[i] == nod){
            euleer(i);
            ++m;
            euler[m] = nod;
            level[m] = level[m - 1] - 1;
            }
    }
}

void creare_rmq(int M2[MAXN][MAXL]){

    int i, j;

    for(i = 0;i < m; ++i)
        M2[i][0] = i;

    for(j = 1;(1 << j) <= m; ++j)
        for(i = 0;i + (1 << j) - 1 < m; ++i)
            if(euler[M2[i][j - 1]] < euler[M2[i + (1 << (j - 1))][j - 1]])
                M2[i][j] = M2[i][j - 1];
            else
                M2[i][j] = M2[i + (1 << (j - 1))][j - 1];
}

int rezultat(int i,int j,int M2[MAXN][MAXL]){

    int k;
    k = log2(j - i + 1);
    return min(euler[M2[i][k]],euler[M2[j - (1 << k) + 1][k]]);

}

int min(int i,int j){

    if(i > j)
        return j;
    return i;

}

int main(){

    FILE *f, *g;
    f=fopen("lca.in","r");
    g=fopen("lca.out","w");
    int i, x, t,a ,b, nivel = 1, aux, j, c, d;
    fscanf(f,"%d %d",&n,&t);
    tata[1] = 0;
    level[0] = -1;
    for(i = 1;i < n; ++i)
        fscanf(f,"%d",&tata[i + 1]);

    euleer(1);
    creare_rmq(M2);

    for(i = 1;i <= t; ++i){
        fscanf(f,"%d %d",&a,&b);
        c = poz[a];
        d = poz[b];
        if(c > d){
            aux = c;
            c = d;
            d = aux;
        }
        fprintf(g,"%d\n",rezultat(c,d,M2));
    }
    return 0;

    }