Cod sursa(job #42268)

Utilizator IgnitionMihai Moraru Ignition Data 29 martie 2007 00:33:30
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define MN (100001)
#define pb push_back

int N, n[MN], c[MN];
vector<int> g[MN];
int s[MN], stop;

int main()
{
	int i, n1, n2;

	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);
	
	scanf("%d", &N);
	for(i = 0; i < N; ++i)
		scanf("%d", &n[i]);
	for(i = 0; i < N-1; ++i) {
		scanf("%d %d", &n1, &n2); --n1; --n2;
		g[n1].pb(n2);
		++c[n2];
	}

	for(i = 0; i < N; ++i) if(c[i] == 0)
		break;

	memset(c, 0, sizeof(c));

	for(s[stop++] = i; stop > 0; ) {
		n1 = s[stop-1];
		if(!c[n1]) {
			c[n1] = c[s[stop-n[n1]-1]]+1;
			n[n1] = 0;
		} else if(n[n1] < g[n1].size())
			s[stop++] = g[n1][n[n1]++];
		else --stop;
	}

	for(i = 0; i < N; ++i)
		printf("%d ", c[i]-1);
	printf("\n");

	return 0;
}