Cod sursa(job #1512407)

Utilizator serbanSlincu Serban serban Data 28 octombrie 2015 00:18:08
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

int t[100005], n;
vector<int> L[100005];
int drum[100005][20];
bool viz[100005];
int start;

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

void dfs(int where, int level) {
    for(int i = 0; i < L[where].size(); i ++) {

        for(int j = 0; j <= drum[where][0]; j ++)
            drum[L[where][i]][j] = drum[where][j];
        drum[L[where][i]][level] = i;
        drum[L[where][i]][0] = level;

        dfs(L[where][i], level + 1);
    }
}

int lca(int x, int y) {
    int poz = start;
    int lim = min(drum[x][0], drum[y][0]);
    for(int i = 1; i <= lim && drum[x][i] == drum[y][i]; i ++) {
        poz = L[poz][drum[x][i]];
    }
    return poz;
}

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

    int m, x, y;
    fscanf(f, "%d %d", &n, &m);
    for(int i = 2; i <= n; i ++) {
        fscanf(f, "%d", &t[i]);
        viz[i] = true;
        L[t[i]].push_back(i);
    }
    for(int i = 1; i <= n; i ++) {
        if(!viz[i])
            start = i;
    }

    drum[start][0] = 0;
    dfs(start, 1);
    for(int i = 1; i <= m; i ++) {
        fscanf(f, "%d %d", &x, &y);
        fprintf(g, "%d\n", lca(x, y));
    }
    return 0;
}