Cod sursa(job #2030931)

Utilizator EdyOnuEdy Onu EdyOnu Data 2 octombrie 2017 15:20:06
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.26 kb
// cerere.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <iostream>
#include <vector>
#include <bitset>
#include <fstream>
#define NMAX 100000

using namespace std;


int N;

vector < int > K;

vector < int > G[NMAX + 1];

bitset < NMAX + 1 > isNotRoot;
vector < int > monkey;

void readData() {

	ifstream f{ "cerere.in" };

	f >> N;

	K.resize(N + 1), monkey.resize(N + 1);

	for (int i = 1; i <= N; ++i)f >> K[i];

	for(int i = 1; i < N; ++i) {
		int x, y;
		f >> x >> y; isNotRoot[y] = true;
		G[x].push_back(y);
	}
}

int getRoot() {

	for (int i = 1; i <= N; ++i) {

		if (isNotRoot[i])continue;

		return i;
	}

	return -1;
}

bitset < NMAX + 1 > viz;

int level = -1, levels[NMAX + 1];

void DFS(int node) {

	levels[++level] = node;
	
	if (level == 0)monkey[node] = 0;

	else 
		monkey[node] =(!K[node] ? 0 : 1 + monkey[levels[level - K[node]]]);

	for (int son : G[node]) {
		if (viz[son])continue;
		viz[son] = true; DFS(son);
	}
	
	--level;
}

void writeAnswer() {
	ofstream g{ "cerere.out" };
	for (int i = 1; i <= N; ++i)g << monkey[i] << ' ';
	g.close();
}



int main(){

	readData();

	DFS(getRoot());

	writeAnswer();
    return 0;
}