Cod sursa(job #443496)

Utilizator nandoLicker Nandor nando Data 17 aprilie 2010 09:14:30
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <cstdio>
#include <vector>
using namespace std;

FILE* fin=fopen("cerere.in","r");
FILE* fout=fopen("cerere.out","w");

#define MAX 100010
typedef vector<int>::iterator iter;

vector<int> arb[MAX];
int g[MAX],k[MAX],stack[MAX],sp=0,n;

void dfs(int nod){
	if(k[nod]==0){
		g[nod]=0;	
	}else{
		g[nod]=g[stack[sp+1-k[nod]]]+1;	
	}
	
	stack[++sp]=nod;
	
	for(iter it=arb[nod].begin();it!=arb[nod].end();it++){
		dfs(*it);	
	}
	
	sp--;
}

int main(){
	fscanf(fin,"%d ",&n);
	
	for(int i=1;i<=n;i++){
		fscanf(fin,"%d ",&k[i]);	
	}
	
	int a,b;
	for(int i=1;i<n;i++){
		fscanf(fin,"%d %d\n",&a,&b);
		arb[a].push_back(b);
	}
	
	dfs(1);
			
	for(int i=1;i<=n;i++){
		fprintf(fout,"%d ",g[i]);	
	}
			
	fclose(fin);
	fclose(fout);
	return 0;	
}