RT orzorz
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10,M=1e6+10;
ll T,n,m,L,V,p[N],tr[M][2];
int ans,cnt;
struct car{
ll d,v,a;
}c[N];
struct lc{
ll l,r;
}cl[N];
bool cmp(lc x,lc y){
if(x.r!=y.r) return x.r<y.r;
return x.l<y.l;
}
int lowbit(int x){
return x&(-x);
}
void add(int x,int t){
while(x<=L+5){
++tr[x][t];
x+=lowbit(x);
}
}
int query(int x,int t){
int res=0;
while(x>0){
res+=tr[x][t];
x-=lowbit(x);
}
return res;
}
int main(){
// freopen("detect.in","r",stdin);
// freopen("detect.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T;
while(T--){
memset(tr,0,sizeof tr);
ans=cnt=0;
cin>>n>>m>>L>>V;
++L;
for(int i=1;i<=n;++i) {
cin>>c[i].d>>c[i].v>>c[i].a;
++c[i].d;
}
for(int i=1;i<=m;++i){
cin>>p[i];
++p[i];
add(p[i],0);
}
ll res,d,v,a,l,r;
for(int i=1;i<=n;++i){
if(c[i].v<=V&&c[i].a<=0)continue;
d=c[i].d,v=c[i].v,a=c[i].a;
if(v>V&&a>=0){
l=d;
r=L;
}
else{
if(a<0){
res=ceil((double)(V*V-v*v)/(2*a)-1);
l=d;
r=min(d+res,L);
}
else {
res=floor((double)(V*V-v*v)/(2*a)+1);
if(d+res>L) continue;
l=d+res;
r=L;
}
}
if(query(r,0)-query(l-1,0)>0){
cl[++cnt]={l,r};
//cout<<i<<" ";
}
}
//cout<<endl;
sort(cl+1,cl+1+cnt,cmp);
for(int i=1;i<=cnt;++i){
if((query(cl[i].r,1)-query(cl[i].l-1,1))==0){
add(cl[i].r,1);
++ans;
}
}
cout<<cnt<<" "<<m-ans<<"\n";
}
cout<<endl;
return 0;
}