voiddfs1(int x, int fa){ if (d[x]+S <= 1000000 && x <= ccf) ok[d[x]+S]++; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; if (y == fa) continue; d[y] = d[x] + a[y]; dfs1(y, x); } }
voiddfs3(int x, int fa, int rt, int v){ if (x > ccf) return; int now = d[x] - d[rt] + S; if (now <= 1000000) ok2[now] += v; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; if (y != fa) dfs3(y, x, rt, v); } }
int stk[N], top;
voidsolve(int x){ if (d[x] == K) { ans[x] = 1; return; } for (int i = 1; i <= top; i++) { int y = stk[i]; int v = d[x] - d[y]; if (v <= K && ok[K-v]) ans[x] = 1; } if (d[x] < K) { int v = K - d[x]; for (int i = 1; i * i <= v; i++) { if (v % i == 0) { if (ok2[i] || ok2[v/i]) ans[x] = 1; } } } }
voiddfs2(int x, int fa){ if (x > ccf) { solve(x); return; } stk[++top] = x; dfs3(x, fa, x, 1); for (int i = head[x]; i; i = pre[i]) { int y = to[i]; if (y != fa) dfs2(y, x); } dfs3(x, fa, x, -1); top--; }
intmain(){ read(n); read(ccf); read(K); read(S); S++; swap(ccf, n); n += ccf; for (int i = 1, p; i <= n; i++) { read(p); read(a[i]); a[i]++; addedge(p, i); } dfs1(0, 0); dfs2(0, 0); for (int i = ccf + 1; i <= n; i++) puts(ans[i]?"YES":"NO"); return0; }