Pagini recente » Cod sursa (job #2957121) | Cod sursa (job #215107) | Cod sursa (job #2941739) | Cod sursa (job #610863) | Cod sursa (job #2539658)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n, rad;
vector<int> urm[100001];
int tt[100001], k[100001], sol[100001];
queue<int> c;
void readAndSet() {
fin >> n;
for (int i = 1; i <= n; i++)
fin >> k[i];
for (int i = 1; i <= n; i++) {
int a, b;
fin >> a >> b;
urm[a].push_back(b);
tt[b] = a;
}
}
int findRoot() {
for (int i = 1; i <= n; i++)
if (!tt[i])
return i;
}
int alKleaTata(int nod, int cate) {
for (int i = 1; i <= cate; i++)
nod = tt[nod];
return nod;
}
void solve() {
c.push(rad);
while (!c.empty()) {
int i = c.front();
c.pop();
if (k[i] == 0)
sol[i] = 0;
else
sol[i] = sol[alKleaTata(i, k[i])] + 1;
for (int j : urm[i])
c.push(j);
}
}
void print() {
for (int i = 1; i <= n; i++)
fout << sol[i] << ' ';
}
int main() {
readAndSet();
rad = findRoot();
solve();
print();
return 0;
}