Pagini recente » Cod sursa (job #2366333) | Cod sursa (job #80333) | Cod sursa (job #805050) | Cod sursa (job #796930) | Cod sursa (job #1932773)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 100006;
vector<int> fii[MAXN];
int k[MAXN];
int n;
bool are_tata[MAXN];
void citire()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for (int i = 1;i <= n;++i)
scanf("%d",&k[i]);
for (int i = 1;i < n;++i)
{
int a,b;
scanf("%d%d",&a,&b);
are_tata[b] = true;
fii[a].push_back(b);
}
}
int stiva[MAXN];
int l_stiva;
int rasp[MAXN];
int indice_fiu[MAXN];
void prelucrare()
{
for (int i = 1;i <= n;++i)
{
rasp[i] = -1;
indice_fiu[i] = -1;
if (!are_tata[i])
stiva[l_stiva = 1] = i;
}
while(l_stiva >= 1)
{
//calculare raspuns pentru acest nod
int nod = stiva[l_stiva];
if (rasp[nod] == -1)
{
rasp[nod] = 0;
if (k[nod] != 0)
rasp[nod] = rasp[stiva[l_stiva - k[nod]]] + 1;
}
++indice_fiu[nod];
if(indice_fiu[nod] < fii[nod].size())
stiva[++l_stiva] = fii[nod][indice_fiu[nod]];
else --l_stiva;
}
}
inline void afisare()
{
for (int i = 1;i < n;++i)
printf("%d ",rasp[i]);
printf("%d\n",rasp[n]);
}
int main()
{
citire();
prelucrare();
afisare();
return 0;
}