Pagini recente » Cod sursa (job #642128) | Cod sursa (job #1979877) | Cod sursa (job #2750133) | Cod sursa (job #3127049) | Cod sursa (job #2777820)
#include <fstream>
#include <vector>
std::ifstream in("cerere.in");
std::ofstream out("cerere.out");
const int N = 1e5+1;
std::vector<int> graph[N];
int k[N], g[N]; //k,g-din enunt
int ramura[N]; //vectorul cu ramura curenta - ramura[i] = nodul de pe nivelul i
bool fr[N]; //1-daca catre el vine o ramura; 0-daca catre el nu e nicio ramura; folosit pentru gasirea root-ului
void dfs(int i, int nivel){
if(!k[i]){
g[i]=0;
}
else{
g[i] = 1 + g[ramura[nivel-k[i]]];
}
ramura[nivel] = i;
for(auto nod : graph[i]){
dfs(nod, nivel+1);
}
}
int main()
{
int n;
in>>n;
for(int i=1;i<=n;++i){
in>>k[i];
}
for(int i=1;i<n;++i){
int a,b;
in>>a>>b;
graph[a].push_back(b);
fr[b] = 1;
}
int root;
for(int i=1;i<=n;++i){
if(!fr[i]){
root = i;
break;
}
}
dfs(root,1);
for(int i=1;i<=n;++i){
out<<g[i]<<' ';
}
return 0;
}