Pagini recente » Cod sursa (job #1886695) | Cod sursa (job #1567868) | Cod sursa (job #1282868) | Cod sursa (job #1094440) | Cod sursa (job #1512124)
#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 main(void) {
FILE *f = fopen("cerere.in", "r");
int n, i, u, v, k, q;
n = readInt(f);
for (i = 0; i < n; i++) {
need[i] = NIL;
ask[i] = readInt(f);
}
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++) {
u = i;
q = 0;
while (ask[u] != 0 && need[u] == NIL) {
v = ask[u];
for (k = 0; (1 << k) <= v; k++) {
if ((v >> k) & 1) {
u = d[k][u];
}
}
q++;
}
if (ask[u]) {
q += need[u];
}
need[i] = q;
fprintf(f, "%d ", q);
}
fclose(f);
return 0;
}