Pagini recente » Monitorul de evaluare | Cod sursa (job #496670) | Istoria paginii runda/i/clasament | Cod sursa (job #1539897) | Cod sursa (job #1007989)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define pb push_back
using namespace std;
const int Nmax = 100005;
vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];
int S[ Nmax ],top;
void scan(int &A)
{
char c = 0;A=0;
do
{
c = fgetc(stdin);
if('0'<=c && c<='9')
A=A*10+c-48;
}while('0'<=c && c<='9');
}
void read()
{
scan(N);
int i,a,b;
for(i = 1 ; i <= N; ++i)
scan(stra[ i ]);
for(i = 1 ; i < N; ++i){
scan(a);scan(b);
G[a].pb(b);
daddy[b] = a;
}
for(i = 1; i <= N; ++i)
if(!daddy[i]) {
root = i;
break;
}
}
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;
else D[ k ] = 0;
for(vector<int>::iterator it= G[k].begin();it!=G[k].end();++it)
DFS(*it);
-- top;
}
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;
}