#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
using vi = vector<int>;
using pii = pair<int, int>;
#define ff first
#define ss second
int n, m, k, len;
const int MAXN = 6000 + 7;
vector<pii> graf[MAXN];
bool ans[MAXN];
pii parent[MAXN];
unordered_map<int, int> sciezki;
unordered_set<int> sciezki2;
void dfs2(int v, int aktlen) {
if (v <= n) sciezki2.insert(aktlen);
for (auto & [s, w] : graf[v]) {
dfs2(s, aktlen + w);
}
}
void dfs3(int v, int aktlen, int delta) {
if (v <= n) {
sciezki[aktlen] += delta;
if (sciezki[aktlen] == 0) sciezki.erase(aktlen);
}
for (auto & [s, w] : graf[v]) {
dfs3(s, aktlen + w, delta);
}
}
void dfs(int v, int aktlen) {
//cout << "OH: " << v << ' ' << aktlen << '\n';
if (graf[v].size()) {
dfs3(v, 0, 1);
for (auto & [s, w] : graf[v]) {
dfs(s, aktlen + w);
}
dfs3(v, 0, -1);
return;
}
if (len == aktlen) {
ans[v] = 1;
}
else {
for (int d = 1; d * d <= len - aktlen; d++) {
// cout << "OHH: " << v << ' ' << len - aktlen << ' ' << d << '\n';
if ((len - aktlen) % d == 0) {
if (sciezki.find(d - k) != sciezki.end()) {
ans[v] = 1;
return;
}
if (sciezki.find((len - aktlen) / d - k) != sciezki.end()) {
ans[v] = 1;
return;
}
}
}
if (sciezki.find(len - aktlen - k) != sciezki.end()) {
ans[v] = 1;
return;
}
}
int v2 = v;
int aktlen2 = 0;
while (v2) {
aktlen2 += parent[v2].ss;
v2 = parent[v2].ff;
if (sciezki2.find(len - aktlen2 - k) != sciezki2.end()) ans[v] = 1;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> len;
cin >> k;
k++;
for (int i = 1; i <= n; i++) {
int p, val;
cin >> p >> val;
graf[p].push_back({i, val + 1});
parent[i] = {p, val + 1};
}
for (int i = n + 1; i <= n + m; i++) {
int p, val;
cin >> p >> val;
graf[p].push_back({i, val + 1});
parent[i] = {p, val + 1};
}
dfs2(0, 0);
sciezki[0] = 1;
dfs(0, 0);
for (int i = n + 1; i <= n + m; i++) {
if (ans[i]) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}