Pagini recente » Cod sursa (job #3197261) | Cod sursa (job #1383957) | Cod sursa (job #2313466) | Cod sursa (job #2858933) | Cod sursa (job #2030937)
// 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 <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;
}