Pagini recente » Cod sursa (job #2051633) | Cod sursa (job #1723667) | Cod sursa (job #2780092) | Cod sursa (job #1856183) | Cod sursa (job #1029059)
#include <iostream>
#include <fstream>
#include<unordered_map>
#include<vector>
#include <stack>
using namespace std;
int n, m, p, a, b, c[1000001], k=1;
ifstream f("cerere.in");
ofstream g("cerere.out");
unordered_map<int, vector<int> > lv;
unordered_map<int, int > lvl;
int v[1000001], out[100001];
void df(int x, int o[]){
c[x]=1;
if(v[x]==0) out[x]=0;
else out[x]=o[lvl[x]-v[x]]+1;
o[lvl[x]]=out[x];
//cout<<lvl[x]<<" "<<x<<' '<<v[x]<<" "<<lvl[x]-v[x]<<' '<<o[lvl[x]-v[x]]<<"\n";
//cout<<lvl[x]<<" ";
//for(int i=1; i<=4; ++i) cout<<o[i]<<' ';
//cout<<'\n';
vector<int>::iterator it;
for(it=lv[x].begin(); it<lv[x].end(); ++it)
if(!c[*it]) lvl[*it]=lvl[x]+1, df(*it, o);
}
int main()
{
//int o[1000001];
//for(int i=0; i<1000001; ++i) o[i]=0;
f>>n;
for(int i=1; i<=n; ++i) f>>v[i];
//r(int i=0; i<1000001; ++i) o[i]=0;
for(int i=1; i<n; ++i){
f>>a>>b;
lv[a].push_back(b);
}
lvl[1]=1;
int ovi[100000];
for(int i=0; i<=n; ++i) ovi[i]=0;
df(1, ovi);
for(int i=1; i<=n; ++i) g<<out[i]<<' ';
return 0;
}