Cod sursa(job #2565480)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 2 martie 2020 14:20:59
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("lca.in");
ofstream out ("lca.out");
int n,m,stramosi[20][100005],a,b,nivel[100005];
vector<int> v[100005];
int niv (int nod, int level) {
    nivel[nod] = level;
    for (int i = 0; i < v[nod].size(); i ++) {
        niv (v[nod][i], level + 1);
    }
}

int main (void) {
    in >> n >> m;
    for (int i = 2; i <= n; i ++) {
        in >> stramosi[0][i];
        v[stramosi[0][i]].push_back (i);
    }
    niv (1,1);
    for (int i = 1; i <= 20; i ++) {
        for (int j = 1; j <= n; j ++) {
            stramosi[i][j] = stramosi[i-1][stramosi[i-1][j]];
        }
    }
    while (m--) {
        in >> a >> b;
        if (nivel[a] != nivel[b]) {
            while (nivel[a] > nivel[b]) {
                a = stramosi[0][a];
            }
            while (nivel[b] > nivel[a]) {
                b = stramosi[0][b];
            }
        }
        if (a == b){ out << a <<"\n" ;continue; }
        else {
            for (int i = 20; i >= 0; i --) {
                if (stramosi[i][a] != stramosi[i][b]) {
                    a = stramosi[i][a];
                    b = stramosi[i][b];
                }
            }
            out << stramosi[0][a] <<"\n";
        }
    }
    return 0;
}