#include<bits/stdc++.h>
using namespace std;
struct bi{
int d,v,a;
}a[110000];
struct pi{
int x,y;
}sp[110000];
int t,n,m,l,v,p[110000],g[1100000],maxx,ans1,ans2;
bool f[1100000];
int read()
{
int x=1,num=0;
char s=getchar();
while(s<'0'||s>'9')
{
if(s=='-') x=-1;
s=getchar();
}
while(s>='0'&&s<='9')
{
num=num*10+s-'0';
s=getchar();
}
return num*x;
}
bool cmp(pi x,pi y)
{
return x.y<y.y;
}
void fun()
{
for(int i=1;i<=n;i++)
{
a[i].d=read();
a[i].v=read();
a[i].a=read();
}
for(int i=1;i<=m;i++)
{
p[i]=read();
maxx=max(maxx,p[i]);
}
for(int i=1;i<=m;i++)
for(int j=p[i-1]+1;j<=p[i];j++)
g[j]=i;
}
void overspeed()
{
for(int i=1;i<=n;i++)
{
if(a[i].a==0)
{
if(a[i].v<=v||a[i].d>maxx) continue;
else
{
ans1++;
sp[ans1].x=g[a[i].d];sp[ans1].y=m;
}
}
if(a[i].a<0)
{
if(a[i].v<=v||a[i].d>maxx) continue;
else
{
long long ds;
ds=(-(v-a[i].v)*(v+a[i].v))/(-2*a[i].a);
if((-(v-a[i].v)*(v+a[i].v))%(-2*a[i].a)!=0) ds++;
if(p[g[a[i].d]]<ds+a[i].d)
{
ans1++;
sp[ans1].x=g[a[i].d];
if(ds+a[i].d>maxx) sp[ans1].y=m;
else sp[ans1].y=g[ds+a[i].d]-1;
}
}
}
if(a[i].a>0)
{
if(a[i].d>maxx) continue;
if(a[i].v>v)
{
ans1++;
sp[ans1].x=g[a[i].d];sp[ans1].y=m;
}
else
{
long long ds;
ds=(v-a[i].v)*(v+a[i].v)/(2*a[i].a);
if(ds+a[i].d<maxx)
{
ans1++;
sp[ans1].x=g[a[i].d+ds];sp[ans1].y=m;
}
}
}
}
}
void least()
{
sort(sp+1,sp+ans1+1,cmp);
for(int i=1;i<=ans1;i++)
{
bool k=0;
for(int j=sp[i].y;j>=sp[i].x;j--)
if(f[j])
{
k=1;
break;
}
if(!k)
{
ans2++;
f[sp[i].y]=1;
}
}
}
int main()
{
//freopen("detect.in","r",stdin);
//freopen("detect.out","w",stdout);
scanf("%d",&t);
while(t--)
{
ans1=0;ans2=0;maxx=0;
memset(f,0,sizeof(f));
scanf("%d %d %d %d",&n,&m,&l,&v);
fun();
overspeed();
least();
printf("%d %d\n",ans1,m-ans2);
}
return 0;
}
maxx变量是我考场上脑抽想出来的