90pts WA on #2
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define int long long
using namespace std;
const int MAXN=1e5+7;
int T,n,m,L,V,N,ans,sum;
struct Car{
int d,v,a;
}c[MAXN];
int p[MAXN],l,r,f[MAXN];
bool used;
bool cmp(Car A,Car B)
{
return A.d>B.d;
}
signed main()
{
//freopen("detect.in","r",stdin);
//freopen("detect.out","w",stdout);
scanf("%lld",&T);
while(T--)
{
sum=0,ans=0,used=0;
memset(f,0,sizeof f);
scanf("%lld %lld %lld %lld",&n,&m,&L,&V);
for(int i=1;i<=n;i++)scanf("%lld %lld %lld",&c[i].d,&c[i].v,&c[i].a);
for(int i=1;i<=m;i++)scanf("%lld",p+i);
sort(p+1,p+1+m);l=0,r=0;
sort(c+1,c+1+n,cmp);
for(int i=n,j=1;i;i--)
{
while(c[i].d>p[j]&&j<=m)j++;
if(j>m)break;
f[i]=j;N=i;
}
//for(int i=1;i<=n;i++)printf("%lld %lld\n",c[i].d,p[f[i]]);
for(int i=1;i<=n;i++)
{
if(!f[i])continue;
bool check=0;
if(c[i].a==0)
{
if(c[i].v>V)
{
sum++,check=1;
if(l+r==0)l=r=m,ans++;
else if(p[r]<c[i].d)ans++,r=m;
}
}
else if(c[i].a>0)
{
int tmp=V*V-c[i].v*c[i].v+c[i].a*c[i].d*2ll;
if(l+r==0&&tmp<2ll*c[i].a*p[m])sum++,ans++,l=r=m;
else if(r&&tmp<2ll*c[i].a*p[r])sum++,check=1;
else if(tmp<2ll*c[i].a*p[m])sum++,ans++,r=m;
}
else if(c[i].a<0)
{
if(c[i].v<V)continue;
int A=-c[i].a;
int tmp=c[i].v*c[i].v-V*V+2ll*c[i].d*A;
if(l+r==0&&tmp>p[f[i]]*2ll*A)sum++,ans++,l=r=f[i];
else if(tmp>p[l]*2ll*A)sum++,check=1;
else if(tmp>p[f[i]]*2ll*A)sum++,ans++,l=min(f[i],l),r=max(r,f[i]),check=1;
}
printf("%lld %lld\n",sum,m-ans);
}
return 0;
}