Pagini recente » Cod sursa (job #109536) | Cod sursa (job #1035062) | Cod sursa (job #3188160) | Borderou de evaluare (job #2761036) | Cod sursa (job #2784623)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
int n,a,b;
const int dim=1e5+10;
vector<vector<int>> adj;
vector<int> ans,lvl,val;
vector<bool> visited;
bitset<dim> outer;
void dfs(int u, int nivel)
{
visited[u] = true;
lvl[nivel]=u;
if(val[u])
ans[u]=ans[lvl[nivel-val[u]]]+1;
for(int v:adj[u]) {
// out<<u<<"-"<<v<<":"<<ans[u]<<"\n";
if(!visited[v]) {
dfs(v, nivel + 1);
}
}
}
int main() {
in>>n;
visited.resize(n+1);
adj.resize(n+1);
val.resize(n+1);
ans.resize(n+1);
lvl.resize(n+1);
for(int i=1;i<=n;i++) {
in >> val[i];
visited[i]=false;
}
for(int i=1;i<=n-1;i++)
{
in>>a>>b;
outer[b]=true;
adj[a].push_back(b);
}
for(int i=1;i<=n;i++)
{
if(outer[i]==false)
{
dfs(i,0);
break;
}
}
for(int i=1;i<=n;i++)
out<<ans[i]<<" ";
return 0;
}