Cod sursa(job #1470160)

Utilizator blasterzMircea Dima blasterz Data 10 august 2015 14:59:31
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define N 100001

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

inline void cit(int &x) {
    x = 0;
    while (ax[pz] < '0' || ax[pz] > '9')
        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;
    }
}

char bx[dim];
int bz;

inline void scrie(int x) {
    char st[10], nst = 0;
    if (x == 0) {
        st[nst++] = 0;
    }
    else {
        while (x) {
            st[nst++] = x % 10;
            x /= 10;
        }
        st[nst] = 0;
    }
    for (int i = nst - 1; i >= 0; --i) {
        if (++bz == dim)
            fwrite(ax, 1, dim, stdout), bz = 0;
        ax[bz] = st[i] + '0';
    }

    if (++bz == dim)
        fwrite(ax, 1, dim, stdout), bz = 0;
    ax[bz] = ' ';
}


struct nod {
    int v;
    nod *next;
};

nod *a[N];

int parent[N];

int st[N];
int n;

int g[N];
int root = 0;
bool used[N];
int nst;

int sol[N];

void add(int p, int q) {
    nod *u = new nod;
    u->v = q;
    u->next = a[p];
    a[p] = u;
}

void dfs(int u) {
    used[u] = true;
    st[++nst] = u;

    if (nst - parent[u] >= 1 && parent[u] != 0)
        sol[u] = sol[ st[ nst - parent[u] ] ] + 1;

    for (nod *it = a[u]; it; it = it->next)
        if (!used[it->v]) {
            dfs(it->v);
        }

    --nst;
}

void afisare() {
    memset(ax, 0, sizeof(ax));
    for (int i = 1; i <= n; ++i)
        scrie(sol[i]);
    if (bz > 0)
        fwrite(ax, 1, bz, stdout);

}

int main() {

    freopen ("cerere.in", "r", stdin);
    freopen ("cerere.out", "w", stdout);
    cit(n);
    int i;
    for (i = 1; i <= n; ++i)
        cit(parent[i]);

    int p, q;

    for (i = 1; i < n; ++i) {
        cit(p); cit(q);
        add(p, q);
        g[q]++;
    }

    for (i =1 ;i <= n; ++i)
        if (!g[i])
            root = i;

    dfs(root);

    afisare();
}