Cod sursa(job #1100373)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 6 februarie 2014 20:42:24
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 0.82 kb
#include <fstream>
#include <vector>
using namespace std;
 
const int MAX_N = 100002;
 
ifstream f("cerere.in");
ofstream g("cerere.out");
 
int N, top;
int K[MAX_N], sol[MAX_N], st[MAX_N];
vector < int > v[MAX_N];
bool F[MAX_N];
 
inline void DFS(int x) {
    st[++top] = x;
    if(K[x])
        sol[x] = sol[st[top-K[x]]] + 1;
    for(size_t i = 0; i < v[x].size(); ++i)
        DFS(v[x][i]);
    --top;
}
 
int main() {
    f >> N;
    for(int i = 1; i <= N; ++i)
        f >> K[i];
    for(int i = 1, x, y; i < N; ++i) {
        f >> x >> y;
        v[x].push_back(y), F[y] = 1;
    }
 
    for(int i = 1; i <= N; ++i)
        if(!F[i])
            DFS(i), i = N;
 
    for(int i = 1; i <= N; ++i)
        g << sol[i] << " ";
    g << "\n";
 
    f.close();
    g.close();
 
    return 0;
}