Pagini recente » Cod sursa (job #2914834) | Cod sursa (job #5711) | Cod sursa (job #2228676) | Cod sursa (job #1926884) | Cod sursa (job #1512127)
#include <stdio.h>
#include <ctype.h>
#define MAX_N 100000
#define BUFFSIZE 65536
#define NIL -1
#define LOG 17
char buf[BUFFSIZE];
int pos = BUFFSIZE;
inline char getChar(FILE *f) {
if (pos == BUFFSIZE) {
fread(buf, 1, BUFFSIZE, f);
pos = 0;
}
return buf[pos++];
}
inline int readInt(FILE *f) {
int q = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
q = (10 * q) + (c - '0');
c = getChar(f);
} while (isdigit(c));
return q;
}
int ask[MAX_N];
int d[LOG][MAX_N];
int need[MAX_N];
int query(int u) {
if (need[u] != NIL) {
return need[u];
}
int k, v = ask[u], *p = &need[u];
for (k = 0; (1 << k) <= v; k++) {
if ((v >> k) & 1) {
u = d[k][u];
}
}
return *p = 1 + query(u);
}
int main(void) {
FILE *f = fopen("cerere.in", "r");
int n, i, u, v, k;
n = readInt(f);
for (i = 0; i < n; i++) {
ask[i] = readInt(f);
if (!ask[i]) {
need[i] = 0;
} else {
need[i] = NIL;
}
}
for (i = 1; i < n; i++) {
u = readInt(f) - 1;
v = readInt(f) - 1;
d[0][v] = u;
}
fclose(f);
for (i = 1; (1 << i) <= n; i++) {
for (k = 0; k < n; k++) {
d[i][k] = d[i - 1][d[i - 1][k]];
}
}
f = fopen("cerere.out", "w");
for (i = 0; i < n; i++) {
fprintf(f, "%d ", query(i));
}
fclose(f);
return 0;
}