Cod sursa(job #181643)

Utilizator DorinOltean Dorin Dorin Data 18 aprilie 2008 18:00:32
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
# include <stdio.h>
# include <cstring>
# include <vector>

using namespace std;

# define input "cerere.in"
# define output "cerere.out"

# define max 100001
# define logmax 17

# define maxim(a,b) (a>b?a:b)

int i,j,n,maxk,k;
int x, y, tata;
int K[max];
vector <int> v[max];
int grad[max];
int t[logmax][max];
int ret[max];

void df(int nod)
{
     if(K[nod] == 0)
        ret[nod] = 0;
     else
     {
         int p = 0;
         int tat = nod;;
         for(int i = 1<<maxk,j=maxk; i; i>>=1,j--)
             if(p + i <= K[nod])p += i,tat = t[j][tat];
         ret[nod] = ret[tat]+1;
     }
     for(int i = 0; i < v[nod].size(); i++)
         df(v[nod][i]);
}

int main()
{
    freopen(input, "r", stdin);
    freopen(output, "w", stdout);

	scanf("%d",&n);
    
    for(i = 1; i<= n; i++)
    {
          scanf("%d ",&K[i]);
          maxk = maxim(maxk,K[i]);
    }
    
    for(i = 1; i < n; i++)
    {
          scanf("%d%d",&x,&y);
          v[x].push_back(y);
          t[0][y] = x;
          grad[y]++;
    }
    for(i = 1;i <= n; i++)
          if(!grad[i]) { tata = i; break; }
        
    t[0][tata] = tata;
        
    for(k = 1; (1<<k) <= maxk; k++)
          for(i = 1; i<=n; i++)
          {
              t[k][i] = t[k-1][t[k-1][i]];
          }
    
    df(tata);
    
    for( i = 1; i<=n ; i++)
         printf("%d ",ret[i]);
    
    return 0;
}