Cod sursa(job #1985307)

Utilizator EmplopiStefan Nitu Emplopi Data 27 mai 2017 13:50:16
Problema Lowest Common Ancestor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>

int lst[100001], urm[100001], f[100001], timp, v[100001], s[100001][17], ti[100001], to[100001];

void dfs(int x){
    int y, p;
    ti[x]=++timp;
    p=lst[x];
    while(p!=0){
        y=f[p];
        dfs(y);
        p=urm[p];
    }
    to[x]=++timp;
}

int intreb(int x, int y){
    int pas=16, z;
    if (ti[x]<=ti[y] && to[y]<=to[x])
        return x;
    else if (ti[y]<=ti[x] && to[x]<=to[y])
        return y;
    while(pas>=0){
        z=s[x][pas];
        if(z!=0 && (ti[z]>to[y] || to[z]<ti[y]))
            x=z;
        pas--;
    }

    return s[x][0];
}

int main(){
    FILE *fin, *fout;
    int n, m, y, i, a, b, nr, j;
    fin=fopen("lca.in", "r");
    fout=fopen("lca.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    y=1;
    for(i=2;i<=n;i++){
        fscanf(fin, "%d", &nr);
        s[i][0]=nr;
        f[y]=i;
        urm[y]=lst[nr];
        lst[nr]=y;
        y++;
    }
    dfs(1);
    for(j=1;j<17;j++)
        for(i=2;i<=n;i++)
            s[i][j]=s[s[i][j-1]][j-1];
    for(i=0;i<m;i++){
        fscanf(fin, "%d%d", &a, &b);
        fprintf(fout, "%d\n", intreb(a, b));
    }
    fclose(fin);
    fclose(fout);

    return 0;
}