Pagini recente » Cod sursa (job #616761) | Cod sursa (job #144892) | Cod sursa (job #2899241) | Cod sursa (job #1364529) | Cod sursa (job #2543948)
#include <bits/stdc++.h>
#define ff first
#define ss second
#define NMAX 100005
#define pb push_back
using namespace std;
const string file = "cerere";
ifstream fin (file+".in");
ofstream fout (file+".out");
typedef long long ll;
typedef long double ld;
const ll INF = 9223372036854775807ll;
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, inf = 2147483647;
int k[NMAX], N;
vector <int> v[NMAX] ; // arborele
//vector <int> vt[NMAX]; //arbore transpus
int tata[NMAX];
int pd[NMAX]; // cat ia pt fiecare maimuta
int ancestors[NMAX], lg; // stramosi pana in pct curent
void go(int x)
{
if(k[x] == 0) pd[x]=0;
else pd[x] = pd[ancestors[lg-k[x]+1]] +1 ;
ancestors[++lg] = x;
for (auto fiu : v[x])
go(fiu);
lg -- ;
}
int main()
{
int x,y,rad;
fin >> N;
for(int i=1;i<=N; ++i)
fin>>k[i] ;
for (int i=1;i<N; ++i) fin>>x>>y, tata[y]=x, v[x].pb(y);
for (int i=1;i <= N; ++i )
{
pd[i]=inf/2;
if (tata[i] == 0) pd[i] =0, rad=i;
}
go(rad);
for(int i=1;i<=N;++i)
fout<<pd[i]<<" ";
return 0;
}