Cod sursa(job #2290831)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 27 noiembrie 2018 01:34:10
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");


int   vector_tati[100005];
int  aux[100005];
int nivel[2000005];
int n, m;

vector<int> matrice_adiacenta[100005];


void parcurgere(int fiu, int tata, int l) {
    aux[fiu] = tata;
    nivel[fiu] = l;
        tata = fiu;
//parcurg vectorul de fii in adancime

for(int i = 0; i< matrice_adiacenta[fiu].size(); i++)
    {
    //apelez recursiv pentru fiecare i elementul aflat pe linia "fiu" respectiv coloana pe care ma situez, i
    //care are acelasi tata dar care se afla pe nivelul urmator in arbore
        parcurgere(matrice_adiacenta[fiu][i], tata, l + 1);
    }
}

void lca(int x, int y) {
    //cat timp tatii celor 2 noduri sunt diferiti
    while (aux[x] != aux[y]) {
        //daca nivelul nodului x < nivelul lui y
        if (nivel[x] < nivel[y]) {
            //y urca si ia valoarea tatalui sau
            y = aux[y];
        } else {
            //in caz contrar, x urca si ia valoarea tatalui sau
            x = aux[x];
        }
    }
//cat timp x si y sunt diferite
    while (x != y) {
        //daca nivelul lui x< nivelul lui y, atunci y ia valorea tatalui sau si astfel
        //se apropie de radacina comuna
        if (nivel[x] < nivel[y]) {
            y = vector_tati[y];
        } else {
            //in caz contrar, x ia valoarea tatalui sau si se apropie de radacina comuna
            x = vector_tati[x];
        }
    }
  g<< x <<'\n';
}


int main() {


  f >> n >> m;
//setez radacina ca fiind nodul 1
    vector_tati[1] = 0;
    //in timp ce citesc vectorul
    for (int i = 2; i <= n; ++i) {
     f >> vector_tati[i];
     //marchez in subvectorii din matrice fiecare element citit
       matrice_adiacenta[vector_tati[i]].push_back(i);

    }
//apelez subprogramul de parcurgere pentru matricea de adiacenta
    parcurgere(1,0,0);

    for (int i = 1; i <= m; ++i) {
        int x,y;
        f >> x >> y;
        lca(x,y);
    }


    return 0;
}