Cod sursa(job #357634)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 19 octombrie 2009 22:37:59
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#include<vector>

using namespace std;

vector <int> v[100001];
int k[100001],ancestor[100001],nr[100001],depth[100001];

void df(int rad,int niv)
{
	depth[niv]=rad;
	if(k[rad]!=0)
		ancestor[rad]=depth[niv-k[rad]];
	for(int i=0;i<(int)v[rad].size();i++)
		df(v[rad][i],niv+1);
}

void solve(int rad)
{
	if(nr[rad]>0 || k[rad]==0)
		return;
	solve(ancestor[rad]);
	nr[rad]=1+nr[ancestor[rad]];
}
			
int main()
{
	int i,a,b,rad,n,father[100001];
	FILE *f=fopen("cerere.in","r");
	fscanf(f,"%i",&n);
	
	for(i=1;i<=n;i++)
	{
		fscanf(f,"%i",k+i);
		father[i]=-1;
		nr[i]=0;
	}
	for(i=0;i<n;i++)
	{
		fscanf(f,"%i%i",&a,&b);
		v[a].push_back(b);
		father[b]=a;
	}
	fclose(f);

	for(i=1;i<=n;i++)
		if(father[i]==-1)
		{
			rad=i;
			break;
		}
	df(rad,0);
	for(i=1;i<=n;i++)
		solve(i);
	f=fopen("cerere.out","w");
	for(i=1;i<n;i++)
		fprintf(f,"%i ",nr[i]);
	fprintf(f,"%i\n",nr[n]);
	fclose(f);
	return 0;
}