Cod sursa(job #352778)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 3 octombrie 2009 14:17:10
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <vector>
#define N 1<<17
#define P 1<<20
#define Q 1<<5
using namespace std;
int n,nr[N],sol[N],parinte[N],poz;
vector <int> v[N];
char viz[N],line[P],line2[Q];
inline int cif(char x)
{
	return x>='0' && x<='9';
}
void read()
{
	scanf("%d\n",&n);
	int i,j,x,y;
	fgets(line+1,P,stdin);
	poz=1;
	for (i=1; i<=n; i++)
	{
		while (line[poz]==' ')
			poz++;
		while(cif(line[poz]))
			nr[i]=nr[i]*10+line[poz]-'0',poz++;
	}
	for (i=1; i<n; i++)
	{
		fgets(line2+1,Q,stdin);
		poz=1;x=0;y=0;
		for (j=1; j<=2; j++)
		{
			while (line2[poz]==' ')
				poz++;
			while(cif(line2[poz]))
				if (j==1)
					x=x*10+line2[poz]-'0',poz++;
				else
					y=y*10+line2[poz]-'0',poz++;
		}
		v[x].push_back(y);
		parinte[y]=x;
	}
}
void solve(int nod)
{
	viz[nod]=1;
	int i,t=nod;
	for (i=1; i<=nr[nod]; i++)
		t=parinte[t];
	if (!viz[t])
	{
		solve(t);
		sol[nod]=sol[t]+1;
	}
	else
		sol[nod]=sol[t]+1;
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	read();
	for (int i=1; i<=n; i++)
	{
		if (!viz[i])
			solve(i);
		printf("%d ",sol[i]-1);
	}
	return 0;
}