Cod sursa(job #2030938)

Utilizator EdyOnuEdy Onu EdyOnu Data 2 octombrie 2017 15:27:55
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
// cerere.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <iostream>
#include <vector>
#include <bitset>
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <memory>
#define NMAX 100001

using namespace std;


class Input_Reader {
private:
	FILE *__inputFile;
	long long fileSize, buffSize;
	unique_ptr < char[] > buffer;
	int Poz = 0;

	inline long long min(long long a, long long b) { return a < b ? a : b; }

	inline void countBytes(const string &fileName) {
		FILE * fin = fopen(fileName.c_str(), "r");
		fseek(fin, 0, SEEK_END);
		fileSize = ftell(fin);
		fclose(fin);
	}

	inline bool isFigure(char x) {
		return x >= '0' && x <= '9';
	}

	void jumpOver() {
		while (!isFigure(buffer[Poz])) {
			if (Poz + 1 == NMAX)fread(buffer.get(), sizeof(char), min(fileSize, NMAX), __inputFile), buffSize = strlen(buffer.get()), Poz = -1;
			++Poz;
		}
	}

	int parse() {
		int number = 0;
		while (!isFigure(buffer[Poz]))jumpOver();
		while (isFigure(buffer[Poz])) {
			number = number * 10 + buffer[Poz] - '0';
			++Poz;
			if (Poz == NMAX)fread(buffer.get(), sizeof(char), min(fileSize, NMAX), __inputFile), buffSize = strlen(buffer.get()), Poz = 0;
		}
		return number;
	}

public:

	explicit Input_Reader(const string &str, const string &mode) {
		__inputFile = fopen(str.c_str(), mode.c_str());

		if (__inputFile == nullptr)throw domain_error("File does not exist !!"s);

		buffer = move(make_unique<char[]>(NMAX));
		countBytes(str);
		fread(buffer.get(), sizeof(char), min(fileSize, NMAX), __inputFile);

		buffSize = strlen(buffer.get());

	}

	Input_Reader &operator >> (int &value) {
		value = parse();
		return *this;
	}

}f("cerere.in", "r");



int N;

vector < int > K;

vector < int > G[NMAX];

bitset < NMAX > isNotRoot;

vector < int > monkey;

void readData() {

	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 > viz;

int level = -1, levels[NMAX];

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;
}