Pagini recente » Cod sursa (job #2950663) | Cod sursa (job #554512) | Cod sursa (job #1987220) | Cod sursa (job #1293123) | Cod sursa (job #2541504)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int n;
int k[100001];
int parent[100001];
int who[100001];
int cnt[100001];
//vector < int > v[100001];
queue < int > c;
bool viz[100001];
//void bfs(int start)
//{
// c.push(start);
// while(!c.empty())
// {
// int nod=c.front();
// c.pop();
// if(viz[nod]==0)
// {
// viz[nod]=1;
// cnt[nod]=cnt[who[nod]]+1;
// for(auto nod_m : v[nod])
// c.push(nod_m);
// }
// }
//}
int s[30000][21];
void init()
{
int i,j;
for(i=1;i<=n;i++)
s[i][0]=parent[i];
for(j=1;j<=20;j++)
for(i=1;i<=n;i++)
s[i][j]=s[s[i][j-1]][j-1];
// afis();
}
void afis()
{
int i,j;
for(j=0;j<=20;j++,cout<<'\n')
for(i=1;i<=n;i++)
cout<<s[i][j]<<' ';
}
int get_who(int nod, int p)
{
int power=0;
while(p)
{
if(p%2!=0)
nod=s[nod][power];
++power;
p/=2;
}
return nod;
}
int main()
{
f>>n;
int i;
for(i=1;i<=n;i++)
f>>k[i];
for(i=1;i<=n-1;i++)
{
int n1,n2;
f>>n1>>n2;
// v[n1].push_back(n2);
parent[n2]=n1;
}
int root;
init();
for(i=1;i<=n;i++)
{
if(parent[i]==0)
root = i;
who[i]=get_who(i,k[i]);
}
for(i=1;i<=n;i++)
{
int cont=0;
int nod=i;
while(k[nod]!=0)
{
nod=who[nod],++cont;
if(cnt[nod]!=-1)
{
cont+=cnt[nod];
break;
}
}
cnt[i]=cont;
g<<cont<<' ';
}
return 0;
}