Pagini recente » Cod sursa (job #475886) | Cod sursa (job #2789407) | Cod sursa (job #2118672) | Cod sursa (job #2755287) | Cod sursa (job #67227)
Cod sursa(job #67227)
#include <cstdio>
#include <string>
#include <deque>
#define MAXN 100001
using namespace std;
int n;
int x[MAXN], tata[MAXN];
bool next[MAXN];
int sol[MAXN];
void citire()
{
freopen("cerere.in", "r", stdin);
scanf("%d\n", &n);
int i;
for(i=1;i<=n;i++) scanf("%d ", &x[i]);
for(i=1;i<n;i++)
{
int xx, yy;
scanf("%d %d\n", &xx, &yy);
tata[yy]=xx;
next[xx]=1;
}
}
void df(int p)
{
deque<int>Q;
int i=p, t, h;
h=x[p];
Q.push_back(p);
do
{
h=x[i];
for( t=0; t<h ; t++,i=tata[i]);
Q.push_back(i);
}while(h);
Q.pop_back();
while(Q.size())
{
sol[Q[0]]=Q.size()-1;
Q.pop_front();
}
}
void calcul()
{
int i;
memset(sol, -1, sizeof(sol));
for(i=1;i<=n;i++)
if(!next[i]) df(i);
for(i=1;i<=n;i++)
if(sol[i]==-1) df(i);
}
int main()
{
citire();
calcul();
freopen("cerere.out", "w", stdout);
for(int i=1;i<=n;i++) printf("%d ", sol[i]);
printf("\n");
return 0;
}