Pagini recente » Cod sursa (job #1426620) | Cod sursa (job #2690481) | Cod sursa (job #2799300) | Cod sursa (job #2548351) | Cod sursa (job #1470383)
#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();
}