Cod sursa(job #1083311)

Utilizator dariusdariusMarian Darius dariusdarius Data 15 ianuarie 2014 21:16:30
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
const int MAX_N = 100005;
vector<int> sons[MAX_N];
int top, stack[MAX_N];
int answer[MAX_N];
int to_whom[MAX_N];
void dfs(int node) {
    stack[top] = node;
    if(to_whom[node] == 0) {
        answer[node] = 0;
    } else {
        answer[node] = answer[stack[top - to_whom[node]]] + 1;
    }
    ++ top;
    for_each(sons[node].begin(), sons[node].end(), dfs);
    -- top;
}
int main() {
    ifstream fin("cerere.in");
    ofstream fout("cerere.out");
    int n, root = 1;
    fin >> n;
    for(int i = 1; i <= n; ++ i) {
        fin >> to_whom[i];
    }
    for(int i = 1; i < n; ++ i) {
        int x, y;
        fin >> x >> y;
        sons[x].push_back(y);
        answer[y] = -1;
        while(answer[root] == -1) {
            ++ root;
        }
    }
    dfs(root);
    for(int i = 1; i <= n; ++ i) {
        fout << answer[i] << (i == n ? '\n' : ' ');
    }
    return 0;
}