#include<bits/stdc++.h>
#define double long double
#define int long long
using namespace std;
int n,m,L,V;
struct CSY{
int num;
}cs;
struct CAR{
double d,v,a,cx;
}ca;
bool cmp(CAR x,CAR y){
return x.cx<y.cx;
}
vector <CAR> car;
map<double,CSY>csy;
void work(){
int ans1=0,ans2=0;
cin>>n>>m>>L>>V;
for(int i=1,d,v,a,ctt;i<=n;i++){
cin>>d>>v>>a;
if(!((v<V and a<=0) or sqrt(2*(L-d)*a+pow(v,2))<=V)){
if(a==0)car.push_back({d,v,a,d});
else car.push_back({d,v,a,((V-v)/a*(V+v))/2});
}
}
for(int i=1;i<=m;i++){
double x;
cin>>x;
csy[x].num=0;
}
sort(car.begin()+1,car.end(),cmp);
for(int i=1;i<car.size();i++){
if(car[i].a>=0){
if(car[i].cx > (--csy.end())->first)continue;
else csy[(--csy.end())->first].num++;
}
else if(car[i].a<0){
if(car[i].cx> (csy.upper_bound(car[i].d))->first) csy[(csy.upper_bound(car[i].d))->first].num++;
else continue;
}
}
map<double,CSY>::iterator t=csy.begin();
for(;t!=csy.end();t++){
if((t->second).num > 0){
ans1+=(t->second).num;
}
else ans2++;
}
cout<<ans1<<" "<<ans2;
return;
}
signed main(){
int T;
cin>>T;
for(int i=1;i<=T;i++){
car.push_back(ca);
work();
car.clear();
csy.clear();
}
return 0;
}
谢谢诸位dalao