Cod sursa(job #1470057)

Utilizator theep0Cruceru Radu theep0 Data 10 august 2015 12:42:33
Problema Cerere Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct nod {
    int idx, r, g;
    struct nod *child, *next;
} nod;

int N, K, G, f, c, i;
nod **mks;
int q[100001];

void dfs(nod *m, nod *p, int level) {
    nod *c;
    m->r = (m->g == 0) ? 0 : mks[q[level - m->g]]->r + 1;
    c = m->child;
    while(c) {
        q[level] = m->idx;
        dfs(c, m, level + 1);
        c = c->next;
    }
}

int main() {
    int cs = 0;
    FILE *fi = freopen("cerere.in", "r", stdin);
    FILE *fo = freopen("cerere.out", "w", stdout);
    scanf("%d", &N);
    mks = (nod**) malloc(sizeof(nod*) * (N+1));
    for (i = 1; i <= N; i++) {
        scanf("%d", &G);
        mks[i] = (nod*) malloc(sizeof(nod));
        mks[i]->idx = i;
        mks[i]->g = G;
    }

    for (i = 1; i < N; i++) {
        scanf("%d %d", &f, &c);
        cs += c;
        mks[c]->next = mks[f]->child;
        mks[f]->child = mks[c];
    }
    dfs(mks[(N * (N + 1)) /2 - cs], NULL, 1);
    for (i = 1; i <= N; i++) {
        printf("%d ", mks[i]->r);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}