Pagini recente » Cod sursa (job #149899) | Cod sursa (job #1083284) | Cod sursa (job #2032548) | Cod sursa (job #1781548) | Cod sursa (job #2218312)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//ifstream fin("omegalul.in");
//ofstream fout("omegalul.out");
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const long N = 100001; //INF = 2e9;
int n;
vector <int> a[N], asc;
int d[N];
void cit()
{
asc.push_back(0);
fin>>n;
for (int i=1; i<=n; i++)
{
int k;
fin>>k;
asc.push_back(k);
}
for (int i=1; i<n; i++)
{
int x, y;
fin>>x>>y;
a[y].push_back(x);
}
}
void dfs(int x, int up)
{
if (up == 0) d[x] = 0;
else
{
d[x] = 1;
int y, curasc = x;
while (up)
{
y = a[curasc][0];
if (y != 1) curasc = y;
//cout<<x<<" "<<up<<" "<<y<<" "<<curasc<<"\n";
up--;
}
if (d[y]) d[x] += d[y];
else
{
dfs(y, asc[y]);
d[x] += d[y];
}
}
}
int main()
{
cit();
for (int i=1; i<=n; i++)
{
//cout<<i<<" / "<<n<<" "<<asc[i]<<" asc\n";
if (!d[i]) dfs(i, asc[i]);
}
for (int i=1; i<=n; i++)
fout<<d[i]<<" ";
return 0;
}