Pagini recente » Cod sursa (job #739372) | Cod sursa (job #691694) | Cod sursa (job #1372671) | Cod sursa (job #2001529) | Cod sursa (job #1007997)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>
#define pb push_back
#define Lim 1000000
#define Next ((++pos==Lim )? f.read(Buffer,Lim) ,pos = 0: 0)
using namespace std;
const int Nmax = 100005;
ifstream f("cerere.in");
vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];
int S[ Nmax ],top;
char Buffer[Lim];
int pos;
inline void Read(int &x)
{
x = 0;
for(;Buffer[pos] < '0' || Buffer[pos] > '9'; Next);
for(;Buffer[pos] >= '0' && Buffer[pos] <= '9'; Next)
x = x*10+Buffer[pos]-'0';
}
inline void read()
{
Read(N);
int i,a,b;
for(i = 1 ; i <= N; ++i)
Read(stra[ i ]);
for(i = 1 ; i < N; ++i){
Read(a);Read(b);
G[a].pb(b);
daddy[b] = a;
}
for(i = 1; i <= N; ++i)
if(!daddy[i]) {
root = i;
break;
}
}
inline void DFS(int k)
{
S[++top] = k;
if(stra[k]) // vecinu'cautat se afla cu stra[k] mai putine poz in stiva
D[ k ] = D[ S[ top - stra[k] ] ] +1;
for(vector<int>::iterator it= G[k].begin();it!=G[k].end();++it)
DFS(*it);
-- top;
}
inline void solve()
{
DFS(root);
for(int i = 1; i <= N ; ++i)
printf("%d ",D[i]);
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
read();
solve();
return 0;
}