#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
using namespace std;
const int MAXN = 1e6 + 10;
const int MAXS = 1e6 + 10;
ll T, n, m, L, V, d[MAXS], a[MAXS], v[MAXS], p[MAXS];
struct info {
ll l, r;
};
bool cmp(info a, info b) {
if (a.r != b.r) return a.r < b.r;
return a.l <= b.l;
}
void solve() {
cin >> n >> m >> L >> V;
vector<ll> suffixl(MAXN, 0);
for (int i = 1; i <= n; i ++ ) cin >> d[i] >> v[i] >> a[i];
for (int i = 1; i <= m; i ++ ) cin >> p[i], suffixl[p[i]] ++;
for (int i = L - 1; i >= 0; i -- ) suffixl[i] += suffixl[i + 1];
ll tot = 0;
vector<info> vec;
for (int i = 1; i <= n; i ++ ) {
if (a[i] == 0) {
if (v[i] <= V) continue;
if (suffixl[d[i]]) {
vec.push_back({d[i], L});
tot ++;
}
} else if (a[i] < 0) {
if (v[i] <= V) continue;
ll s = (V * V - v[i] * v[i]) / (2 * a[i]);
if ((V * V - v[i] * v[i]) % (2 * a[i]) == 0) s --;
s += d[i];
s = min(s, L);
if (suffixl[d[i]] - suffixl[s + 1]) {
vec.push_back({d[i], s});
tot ++;
}
} else if (a[i] > 0) {
ll s = (V * V - v[i] * v[i]) / (2 * a[i]);
if ((V * V - v[i] * v[i]) % (2 * a[i]) == 0) s ++;
s += d[i];
s = min(s, L);
if (suffixl[s]) {
vec.push_back({s, L});
tot ++;
}
}
}
sort(vec.begin(), vec.end(), cmp);
ll ip = 0, jp = 0, next_jp = 0;
set<ll> st;
for (ip = 0; ip < vec.size(); ip ++ ) {
if (vec[ip].l <= p[next_jp] && vec[ip].r >= p[next_jp] && ip != 0) {
st.insert(next_jp);
continue;
}
while (!(vec[ip].l <= p[jp] && p[jp] <= vec[ip].r) && jp <= m) jp ++;
while (vec[ip].l <= p[jp] && p[jp] <= vec[ip].r && jp <= m) {
next_jp = jp;
jp ++;
}
st.insert(next_jp);
}
cout << tot << " " << m - st.size() << "\n";
}
int main() {
IOS
cin >> T;
while (T -- ) {
solve();
}
return 0;
}