Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul 1
, fiii rădăcinii pe nivelul 2
, fiii fiilor rădăcinii pe nivelul 3
, etc.
Cerința
Se dă vectorul de tați al unui arbore cu rădăcină cu n
noduri și k
noduri din arbore. Determinați pentru fiecare dintre cele k
noduri nivelul pe care se află.
Date de intrare
Fișierul de intrare nivele.in
conține pe prima linie numărul de noduri n
. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a treia conține numărul k
, iar linia a patra k
noduri, x[1]
, x[2]
, … , x[k]
.
Date de ieșire
Fișierul de ieșire nivele.out
va conține k
linii. Linia i
va conține nivelul pe care se află nodul x[i]
în arborele dat
Restricții și precizări
1 ≤ k ≤ n ≤ 100
- în vectorul de tați rădăcina este marcată cu
0
Exemplu
nivele.in
7 4 1 7 0 7 7 1 4 1 3 4 7
nivele.out
2 4 1 3
#include <bits/stdc++.h> using namespace std; ifstream cin("nivele.in"); ofstream cout("nivele.out"); vector <int> G[101]; int n , p , x , y , k , T[102] , P[101] , niv[101]; void dfs(int x , int n) { P[x] = 1; niv[x] = n; for(auto i:G[x]) if(!P[i]) dfs(i , n + 1); } int main() { cin >> n; for(int i = 1 ; i <= n ; i++) { cin >> T[i]; G[T[i]].push_back(i); G[i].push_back(T[i]); if(T[i] == 0) p = i; } dfs(p , 1); cin >> k; for(int i = 1 ; i <= k ; i++) { cin >> x; cout << niv[x] << '\n'; } }