#include<bits/stdc++.h>
using namespace std;
int t;
int n,m,L,V;
struct car{
int d,v,a;
double st,ed;
}c[100005];
struct sb{
double s,e,nu;
friend bool operator <(sb ala,sb alb){
return ala.e<alb.e;
}
}d[100005];
int p[100005];
int ans=0;
int cnt=0;
int tmp;
int main(){
scanf("%d",&t);
while(t--){
memset(c,0,sizeof(c));
memset(p,0,sizeof(p));
memset(d,0,sizeof(d));
ans=0;
cnt=0;
scanf("%d %d %d %d",&n,&m,&L,&V);
for(int i=1;i<=n;i++){
scanf("%d %d %d",&c[i].d,&c[i].v,&c[i].a);
if(c[i].a<=0&&c[i].v<=V){
i--;
n--;
}
}
for(int i=1;i<=m;i++){
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++){
if(c[i].a==0){
c[i].st=c[i].d;
c[i].ed=L+1;
}else{
if(c[i].v>V){
if(c[i].a>0){
c[i].st=c[i].d-0.001;
c[i].ed=L+1;
continue;
}
double p=(V*V-c[i].v*c[i].v)*1.0/(2*c[i].a)+c[i].d;
if(p>L+1){
c[i].st=c[i].d-0.001;
c[i].ed=L+1;
continue;
}
c[i].st=c[i].d-0.001;
c[i].ed=p;
}
if(c[i].v<=V){
double p=(V*V-c[i].v*c[i].v)*1.0/(2*c[i].a)+c[i].d;
if(p>L+1){
c[i].st=L+1;
c[i].ed=L+1;
continue;
}
c[i].st=p;
c[i].ed=L+1;
}
}
}
sort(p+1,p+m+1);
for(int i=1;i<=n;i++)
{
int l=1,r=m;
int mid=0;
bool flag=0;
while(r>=l){
mid=(l+r)/2;
if(p[mid]>=c[i].ed){
r=mid-1;
}else if(p[mid]<=c[i].st){
l=mid+1;
}else{
flag=1;
break;
}
}
if(flag){
d[++cnt].s=c[i].st;
d[cnt].e=c[i].ed;
}
}
n=cnt;
int pans=0;
sort(d+1,d+n+1);
for(int i=1;i<=n;i++){
if(p[pans]>=d[i].s){
continue;
}else{
ans++;
int l=1,r=m;
while(r>=l){
int mid=(l+r)/2;
if(p[mid]<d[i].e){
l=mid+1;
pans=mid;
}else{
r=mid-1;
}
}
}
}
printf("%d %d\n",cnt,m-ans);
}
return 0;
}