Cod sursa(job #2646981)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 2 septembrie 2020 16:27:49
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
//#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 100000;

int k[1 + NMAX];
bool parinte[1 + NMAX];
vector<int> graf[1 + NMAX];

int stiva[1 + NMAX];
int top = 0;
int sol[1 + NMAX];

void dfs(int nod)
{
  top++;
  stiva[top] = nod;

  int top_temp = top;
  int temp = nod;

  //cout << nod << endl;

  while(k[temp] != 0)
  {
    top_temp = top_temp - k[temp];
    temp = stiva[top_temp];
    sol[nod]++;

    //cout << temp << ' ';
  }
  //cout << endl;

  for (int i = 0; i < graf[nod].size(); i++)
  {
    int fiu = graf[nod][i];
    dfs(fiu);
  }

  top--;
}

int main()
{
  ifstream in("cerere.in");
  ofstream out("cerere.out");

  int n;
  in >> n;
  for (int i = 1; i <= n; i++)
  {
    in >> k[i];
  }
  for (int i = 1; i <= n - 1; i++)
  {
    int a, b;
    in >> a >> b;
    parinte[b] = true;
    graf[a].push_back(b);
  }

  for (int i = 1; i <= n; i++)
  {
    if (!parinte[i])
    {
      dfs(i);
      break;
    }
  }

  for (int i = 1; i <= n; i++)
  {
    out << sol[i] << ' ';
  }

  return 0;
}