#include #include #include using namespace std; int n; vector > g; vector col; int dfs(int x) { if (g[x].first == -1) { return (col[x]); } return col[x] = 6 - dfs(g[x].first) - dfs(g[x].second); } int main() { freopen("coloring.in", "r", stdin); //freopen("coloring.out", "w", stdout); int son[3]; while (true) { scanf("%d\n", &n); if (!n) { return 0; } g.assign(n, make_pair(-1, -1)); int p; for (int i = 1, j = 0; i < n; ++i) { scanf("%d\n", &p); if (p == 1) { son[j] = i; ++j; continue; } if (g[p - 1].first == -1) { g[p - 1].first = i; } else { g[p - 1].second = i; } } int m; scanf("%d\n", &m); int x, c; col.resize(n); for (int i = 0; i < m; ++i) { scanf("%d %d\n", &x, &c); col[x - 1] = c; } int a, b; a = dfs(son[0]); b = dfs(son[1]); c = dfs(son[2]); if (a + b + c == 6) { printf("NO\n"); } else { if (a == b && a == c) { col[0] = ((a + 1) % 3) + 1; } else { if (a == b) { col[0] = 6 - a - c; } else { if (a == c) { col[0] = 6 - a - b; } else { col[0] = 6 - a - c; } } } printf("YES\n"); for (int i = 0; i < n; ++i) { printf("%d ", col[i]); } scanf("\n"); printf("\n"); } } }