Cod sursa(job #2691219)

Utilizator euyoTukanul euyo Data 27 decembrie 2020 16:03:08
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <cctype>
#include <vector>
 
using namespace std;
 
const int MaxN = 100002;
 
FILE *fin = fopen( "cerere.in", "r" );
FILE *fout = fopen( "cerere.out", "w" );
  
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 getNum() {
  int n = 0;
  char ch;
  while ( isspace( ch = fgetc( fin ) ) );
  do {
    n = n * 10 + ch - '0';
  } while ( isdigit( ch = fgetc( fin ) ) );
  return n;
}
void giveNum( int n ) {  
  int m = n, p = 10;

  while ( m > 9 ) {
	p *= 10;
	m /= 10;
  }
  p /= 10;
  while ( p > 0 ) {
	fputc( n / p + '0', fout );
	n %= p;
	p /= 10;
  }
  fputc( ' ', fout );
}

int main() {
  int n, x, y;
 
  n = getNum();
  for ( int i = 0; i < n; ++i ) {
    k[i] = getNum();
  }
  for ( int i = 1; i < n; ++i ) {
	x = getNum();
	y = getNum();
	--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 ) {
    giveNum( nq[i] );
  }
  fclose( fin );
  fclose( fout );
  return 0;
}