Pagini recente » Cod sursa (job #3244558) | Cod sursa (job #1938766) | Cod sursa (job #2699624) | Cod sursa (job #827620) | Cod sursa (job #2136114)
#include <cstdio>
#include <vector>
#include <algorithm>
#define nmax 100005
using namespace std;
FILE *f=fopen("cerere.in","r");
FILE *g=fopen("cerere.out","w");
vector<int>Q[nmax],topsorted,tobesorted;
int n,stramos[nmax],tata[nmax],intel[nmax];
void read()
{
fscanf(f,"%d",&n);
for (int i=1;i<=n;++i)
fscanf(f,"%d",&stramos[i]);
for (int i=1;i<n;++i)
{
int a,b;
fscanf(f,"%d %d",&a,&b);
Q[a].push_back(b);
tata[b]=a;
}
}
int parent(int nod,int ramas)
{
if (ramas==0)
return nod;
parent(tata[nod],ramas-1);
}
void topsort(int nod)
{
for (auto w:Q[nod])
topsort(w);
topsorted.push_back(nod);
}
void solve()
{
for (int i=1;i<=n;++i)
if (!tata[i])
tobesorted.push_back(i);
for (auto w:tobesorted)
topsort(w);
reverse(topsorted.begin(),topsorted.end());
for (auto w:topsorted)
{
if (stramos[w]==0)
intel[w]=0;
else
intel[w]=intel[parent(w,stramos[w])]+1;
}
for (int i=1;i<=n;++i)
fprintf(g,"%d ",intel[i]);
}
int main()
{
read();
solve();
return 0;
}