Cod sursa(job #2542189)

Utilizator nicolaee2Martinescu Nicolae nicolaee2 Data 9 februarie 2020 17:57:50
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <bits/stdc++.h>

#define NMAX 100005
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n;
int t[NMAX];
int val[NMAX];
int calc[NMAX];

void citire()
{
   fin>>n;
   for(int i=1;i<=n;i++)
   {
      calc[i] = -1;
      fin>>val[i];
   }
   for(int i=1;i<=n-1;i++)
   {
      int x,y;
      fin>>x>>y;
      t[y] = x;
   }

}

void upTree(int n)
{
   int save = n;
   int k = val[n];
   for(int i=1;i<=k;i++)
      n = t[n];

   if(calc[n] == -1)
   {
      if(val[n] == 0)
      {
         calc[save] = 1;
      }
      else
      {
         upTree(n);
         calc[save] = calc[n] + 1;
      }
   }
   else
   {
      calc[save] = calc[n] + 1;
   }


}

void rezolva()
{
   for(int i=1;i<=n;i++)
   {
      if(calc[i] == -1)
      {
         if(val[i] == 0)
         {
            calc[i] = 0;
            fout<<0<<" ";
         }
         else
         {
            upTree(i);
            fout<<calc[i]<<" ";
         }
      }
      else
      {
         fout<<calc[i]<<" ";
      }
   }
}

int main()
{
   citire();
   rezolva();
}