Cod sursa(job #14257)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 8 februarie 2007 16:24:09
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#define fin  "cerere.in"
#define fout "cerere.out"
#define Nmax 100001
int n,m,v[Nmax],ret[Nmax],adr[Nmax],list[Nmax][2],gri[Nmax];
int st[Nmax];
FILE *in,*out;

inline void swap (int &a,int &b) { int aux; aux=a; a=b; b=aux; }

void qsort(int st,int dr) {
int i,j,m;
	i=st; j=dr;
	m=list[(i+j)/2][0];

	do {
		while (list[i][0]<m) ++i;
		while (list[j][0]>m) --j;
		if (i<=j) {
			swap(list[i][0],list[j][0]);
			swap(list[i][1],list[j][1]);
			++i; --j;
		}
	} while (i<j);

	if (i<dr) qsort(i,dr);
	if (j>st) qsort(st,j);
}

void df(int nod) {
int i,str;
	st[++st[0]]=nod;

	if (v[nod]!=0) {
		str=st[st[0]-v[nod]];
		ret[nod]=1+ret[str];
	}

	for (i=adr[nod];list[i][0]==nod && i<=m;++i) 
		df(list[i][1]);

	st[0]--;
}

int main() {
int i,j,start;
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%i",&n);

	for (i=1;i<=n;++i) 
		fscanf(in,"%i",&v[i]);
	
	for (i=1;i<n;++i) {
		int a,b;
		fscanf(in,"%i%i",&a,&b);
		list[i][0]=a;
		list[i][1]=b;
		gri[b]++;
	}

	m=n-1;

	qsort(1,m);
	
	for (i=1;i<=m;) {
		
		for(j=i;list[j][0]==list[i][0] && j<=m;++j);

		adr[list[i][0]]=i;
		i=j;
	}
	
	for (i=1;i<=n;++i) if (gri[i]==0) start=i;

	v[start]=0;

	df(start);

	for (i=1;i<=n;++i) {
		if (i>1) fprintf(out," ");
		fprintf(out,"%i",ret[i]);
	}

	fprintf(out,"\n");

	fclose(in); fclose(out);

	return 0;
}