Cod sursa(job #189227)

Utilizator pandaemonAndrei Popescu pandaemon Data 12 mai 2008 22:27:07
Problema Cerere Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<stdio.h>
#include<iostream.h>
#include<string.h>

#define NMAX 100000

struct lista { int val; lista *last; } *p[NMAX+5];

int n, k,cerere[NMAX+5],st[NMAX+5],sol[NMAX+5];


void df(int x)
{
  st[++k]=x; 

  if(cerere[x] != 0)  sol[x] = sol[ st[k-cerere[x]] ] + 1;

  for(lista *p1=p[x]; p1!=NULL; p1=p1->last)

  { df(p1->val); k--; }

}


int main()
{
  freopen("cerere.in","r",stdin);
  freopen("cerere.out","w",stdout);

  int fiu[NMAX],i;

  memset(fiu, 0, sizeof(fiu) );

  scanf("%d",&n);

  for(i=1; i<=n; i++) scanf("%d", &cerere[i]);

  int var1,var2;  lista *p1;

  for(i=1; i<n; i++)
  {
    scanf("%d %d", &var1,&var2);   fiu[var2]=1;

    p1 = new lista;

    p1->val = var2;

    p1->last = p[var1];

    p[var1] = p1;
  }


  for(i=1; i<=n; i++) if(fiu[i]==0) { df(i); break; }

  if(i==n+1) while(3);

  for(i=1; i<=n; i++) printf("%d ", sol[i]);


  printf("\n"); return 0;

}