Cod sursa(job #1277321)

Utilizator lokixdSebastian lokixd Data 27 noiembrie 2014 15:51:11
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 0.99 kb
#include <cstdio>
#include <vector>
 
using namespace std;
 
vector<int> g[100001];
int k[100001];
int st[100001];
int st_size = 0;
int sol[100001];
bool root[100001];
 
void dfs(int node)
{
    st[++st_size] = node;
    if (k[node] == 0)
        sol[node] = 0;
    else
        sol[node] = sol[st[st_size - k[node]]] + 1;
    for (int i = 0; i < g[node].size(); ++i)
        dfs(g[node][i]);
    st_size--;
}
 
int main()
{
    FILE *in = fopen("cerere.in", "r");
    FILE *out = fopen("cerere.out", "w");
 
    int n;
    fscanf(in, "%d", &n);
 
    for (int i = 1; i <= n; ++i)
        fscanf(in, "%d", &k[i]);
    for (int x, y, i = 1; i < n; ++i)
    {
        fscanf(in, "%d%d", &x, &y);
        g[x].push_back(y);
        root[y] = 1;
    }
 
    for (int i = 1; i <= n; ++i)
        if (!root[i])
            dfs(i);
    fprintf(out, "%d", sol[1]);
    for (int i = 2; i <= n; ++i)
        fprintf(out, " %d", sol[i]);
    fprintf(out, "\n");
 
    return 0;
}