Pagini recente » Cod sursa (job #1362833) | Cod sursa (job #481532) | Cod sursa (job #1691808) | Cod sursa (job #1709813) | Cod sursa (job #443497)
Cod sursa(job #443497)
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
FILE* fin=fopen("cerere.in","r");
FILE* fout=fopen("cerere.out","w");
#define MAX 100010
typedef vector<int>::iterator iter;
bitset<MAX> notRoot,viz;
vector<int> arb[MAX];
int g[MAX],k[MAX],stack[MAX],sp=0,n;
void dfs(int nod,int lvl){
if(k[nod]==0){
g[nod]=0;
}else{
g[nod]=g[stack[lvl-k[nod]]]+1;
}
stack[++sp]=nod;
viz[nod]=true;
for(iter it=arb[nod].begin();it!=arb[nod].end();it++){
if(!viz[*it]){
dfs(*it,lvl+1);
}
}
sp--;
}
int main(){
fscanf(fin,"%d ",&n);
for(int i=1;i<=n;i++){
fscanf(fin,"%d ",&k[i]);
}
int a,b,top;
for(int i=1;i<n;i++){
fscanf(fin,"%d %d\n",&a,&b);
arb[a].push_back(b);
notRoot[b]=true;
}
for(int i=1;i<=n;i++){
if(!notRoot[i]){
dfs(i,1);
}
}
for(int i=1;i<=n;i++){
fprintf(fout,"%d ",g[i]);
}
fclose(fin);
fclose(fout);
return 0;
}