Cod sursa(job #3688)

Utilizator megabyteBarsan Paul megabyte Data 27 decembrie 2006 19:34:14
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <stdio.h>
#include <stdlib.h>
#define INF "cerere.in"
#define OUF "cerere.out"
#define NMAX 131072
int st[NMAX],rec[NMAX],sol[NMAX],sum=0;
struct nod
{
	int c;
	nod *next;
};

struct head
{
	nod *p,*q;
}la[NMAX];

void dfs(nod *p,int k)
{
	while(p!=NULL)
	{
		if(rec[p->c]!=0) st[k]=st[k-rec[p->c]]+1;
		else st[k]=0;
		sol[p->c]=st[k];
		dfs(la[p->c].p,k+1);
		p=p->next;
	}
}

int main()
{
	int i,n,x,k,master;
	nod *op;
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	fscanf(in,"%d",&n);
	for(i=1;i<=n;i++) {la[i].p=la[i].q=NULL;fscanf(in,"%d",rec+i);}
	master=n;
	for(i=1;i<n;i++)
	{
		op=new nod;
		op->next=NULL;fscanf(in,"%d %d",&x,&k);
		op->c=k;
		if(la[x].p==NULL){la[x].p=la[x].q=op;}
		else {la[x].q->next=op;la[x].q=op;}
		master=master^k;master=master^i;
	}
	st[1]=0;
	dfs(la[master].p,1);	
	//printf("%d",master);
	for(i=1;i<=n;i++) fprintf(out,"%d ",sol[i]);
	fclose(in);fclose(out);
	return 0;
}