Cod sursa(job #2691212)

Utilizator euyoTukanul euyo Data 27 decembrie 2020 15:45:16
Problema Cerere Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
#include <vector>

using namespace std;

const int MaxN = 100002;

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

vector<int> T[MaxN];
int root[MaxN];
int k[MaxN];
int vis[MaxN], vis_val;

int s[MaxN], sp;
int nq[MaxN];

void DFS( int node ) {
  s[sp++] = node;
  vis[node] = vis_val;
  if ( k[node] ) {
    nq[node] = nq[s[sp - k[node] - 1]] + 1;
  }
  for ( int i = 0; i < T[node].size(); ++i ) {
    if ( vis[T[node][i]] != vis_val ) {
	  DFS( T[node][i] ); 
	}
  }
  --sp;
}

int main() {
  int n, x, y;

  fin >> n;
  for ( int i = 0; i < n; ++i ) {
	fin >> k[i];
  }
  for ( int i = 1; i < n; ++i ) {
	fin >> x >> y;
	--x;
	--y;
    T[x].push_back( y );
	T[y].push_back( x );
    root[y] = 1;
  }
  vis_val = 1;
  for ( int i = 0; i < n; ++i ) {
	if ( !root[i] ) {
	  DFS( i );
	  ++vis_val;
	}
  }
  for ( int i = 0; i < n; ++i ) {
	fout << nq[i] << " ";
  }
  fin.close();
  fout.close();
  return 0;
}