Pagini recente » Cod sursa (job #1041174) | Cod sursa (job #1310657) | Cod sursa (job #1947037) | Cod sursa (job #2336285) | Cod sursa (job #2777620)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int t[17][100001],k[100001],str[100001],nrr[100001];
vector<int>v[100001];
bool viz[100001];
int stramos(int p,int x)
{
int nr=0;
while(p)
{
if(p%2==1)
x=t[nr][x];
p/=2;
nr++;
}
return x;
}
void dfs(int nod,int prt)
{
viz[nod]=true;
for(auto q:v[nod])
{
if(q!=prt)
{
if(k[q])
{
nrr[q]=nrr[nod]+1;
}
dfs(q,nod);
}
}
}
int main()
{
int n,i,j;
fin>>n;
for(i=1;i<=n;i++)
fin>>k[i];
for(i=2;i<=n;i++)
{
int a,b;
fin>>a>>b;
t[0][b]=a;
}
for(i=1;i<=16;i++)
{
for(j=2;j<=n;j++)
{
t[i][j]=t[i-1][t[i-1][j]];
}
}
for(i=1;i<=n;i++)
{
str[i]=stramos(k[i],i);
/*if(i>1&&i!=str[i])
{
v[i].push_back(str[i]);
v[str[i]].push_back(i);
}*/
}
for(i=1;i<=n;i++)
{
int nr=0,ci=i;
while(k[ci])
{
ci=str[ci];
nr++;
}
fout<<nr<<" ";
}
/*for(i=1;i<=n;i++)
if(!viz[i])
dfs(i,0);
for(i=1;i<=n;i++)
fout<<nrr[i]<<" ";*/
}