Pagini recente » Cod sursa (job #2633840) | Cod sursa (job #2584314) | Cod sursa (job #1934545) | Cod sursa (job #2945300) | Cod sursa (job #2290831)
#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;
}