Cod sursa(job #1582454)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 27 ianuarie 2016 22:17:38
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>

using namespace std;

const int Mn = 1e5 + 6;

int n,it;
int k[Mn],sol[Mn],stk[Mn];
bool used[Mn];
vector< int > g[Mn];

void dfs(int node)
{
    stk[++it] = node;

    if (k[node])
       sol[node] = sol[stk[it - k[node]]] + 1;

    for (int i = 0;i < g[node].size();i++)
        dfs(g[node][i]);

    it--;
}

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

     scanf("%d",&n);

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

     for (int i = 1;i < n;i++)
     {
         int x,y;
         scanf("%d %d",&x,&y);
         g[x].push_back(y);
         used[y] = 1;
     }

     int i = 1;
     for (;used[i];i++);

     dfs(i);

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

     printf("\n");

  return 0;
}