Pagini recente » Cod sursa (job #2812065) | Cod sursa (job #1106859) | Cod sursa (job #161935) | Cod sursa (job #2047165) | Cod sursa (job #780531)
Cod sursa(job #780531)
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <fstream>
using namespace std;
#define nmax 100010
#define bmax 7000010
int sol[nmax], used[nmax], K[nmax], stack[nmax], A, B, N, indB;
vector<int> G[nmax];
char buff[bmax];
void DFS(int node, int pos)
{
if(K[node] == 0) sol[node] = 0;
else sol[node] = 1 + sol[ stack[pos - K[node]] ];
stack[pos] = node;
for(vector<int> :: iterator it = G[node].begin(); it != G[node].end(); ++it)
DFS(*it, pos + 1);
}
int Get()
{
int nr = 0;
while(!(buff[indB] >= '0' && buff[indB] <= '9'))
indB ++;
while(buff[indB] >= '0' && buff[indB] <= '9')
nr = nr * 10 + buff[indB] - '0',
indB ++;
return nr;
}
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int i;
fread(buff, 1, bmax, stdin);
N = Get();
for(i = 1; i <= N; i++) K[i] = Get();
int Q = N * (N + 1) / 2;
for(i = 1; i < N; i++)
{
A = Get();
B = Get();
G[A].push_back(B);
Q -= B;
}
DFS(Q, 1);
for(i = 1; i <= N; i++) printf("%i ", sol[i]);
return 0;
}