Cod sursa(job #1470383)

Utilizator blasterzMircea Dima blasterz Data 10 august 2015 22:28:33
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <cstdio>
#include <cstring>
  
using namespace std;
  
#define N 100001
  
#define dim 16000
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 s[7];
    int  ns = 0;
    if (x == 0) {
        s[ns++] = 0;
    }
    else {
        while (x) {
            s[ns++] = x % 10;
            x /= 10;
        }
        s[ns] = 0;
    }
    for (int i = ns - 1; i >= 0; --i) {
        bx[bz] = s[i] + '0';
        if (++bz == dim)
            fwrite(bx, 1, dim, stdout), bz = 0;
    }
     
    bx[bz] = ' ';
    if (++bz == dim)
        fwrite(bx, 1, dim, stdout), bz = 0;
}
  
  
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;
}
  
inline void dfs(int u) {
    st[++nst] = u;
  
    if (parent[u] != 0)
        sol[u] = sol[ st[ nst - parent[u] ] ] + 1;
  
    for (nod *it = a[u]; it; it = it->next)
        dfs(it->v);
  
    --nst;
}

int st2[N], nst2;
int height[N];

void dfs2(int root) {
    int u, i, cnt;
    nod *it;
    st[++nst] = root;
    height[root] = 1;
    int prev = root;
    while (nst > 0) {
        u = st[nst];
        
        if (u != prev && height[u] != height[prev] + 1)
            for (i = height[u] - height[u] + 1; i >= 0; --i)
                --nst2;
        prev = u;
        st2[++nst2] = u;
        
        if (parent[u] != 0)
            sol[u] = sol[ st2[ nst2 - parent[u] ] ] + 1;
        
        u = st[nst--];
        
        for (it = a[u]; it ; it = it->next)
            st[++nst] = it->v,
            height[it->v] = height[u] + 1;
    }
}
  
void afisare() {
    for (int i = 1; i <= n; ++i)
        scrie(sol[i]);
    bx[bz++] = '\n';
    fwrite(bx, 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;
  
    dfs2(root);
  
    afisare();
}