Cod sursa(job #1470130)

Utilizator theep0Cruceru Radu theep0 Data 10 august 2015 13:59:27
Problema Cerere Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>

#define MN 100001

#define dim 8192
char ax[dim];
int pz;

int N, K, f, c, i;
int q[MN];
int G[MN];
int R[MN];
int ch[MN][150];

void cit(int *x) {
    *x = 0;
    while (ax[pz] < '0' || ax[pz] > '9') {
        ++pz;
        if (pz == dim) fread(ax, 1, dim, stdin), pz = 0;
    }
    while (ax[pz] >= '0' && ax[pz] <= '9') {
        *x = *x * 10 + ax[pz++] - '0';
        if (pz == dim) fread(ax, 1, dim, stdin), pz = 0;
    }
}

void dfs(int u, int level) {
    int i;
    R[u] = (G[u] == 0) ? 0 : R[q[level - G[u]]] + 1;
    for (i = 1; i <= ch[u][0]; i++) {
        q[level] = u;
        dfs(ch[u][i], level + 1);
    }
}

int main() {
    int cs = 0;
    FILE *fi = freopen("cerere.in", "r", stdin);
    FILE *fo = freopen("cerere.out", "w", stdout);
    cit(&N);
    for (i = 1; i <= N; i++) {
        cit(&G[i]);
    }

    for (i = 1; i < N; i++) {
        cit(&f), cit(&c);
        cs += c;
        ch[f][++ch[f][0]] = c;
    }
    dfs((N * (N + 1)) /2 - cs, 1);
    for (i = 1; i <= N; i++) {
        printf("%d ", R[i]);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}