WA on #4 #6 #8 #10
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int t;
int n,m,l,V;
int d[N],p[N];
int v[N],a[N];
struct node{
int l,r;
};
node sp[N];
bool cmp(node x,node y)
{
if(x.r==y.r)
return x.l<y.l;
return x.r<y.r;
}
int read()
{
int sum=0;
char a=getchar();
int f=1;
while(a<'0'||a>'9')
{
if(a=='-')
f=-1;
a=getchar();
}
while(a>='0'&&a<='9')
{
sum=sum*10+a-'0';
a=getchar();
}
return sum*f;
}
int main()
{
// freopen("hhr.in","r",stdin);
// freopen("hhr.out","w",stdout);
t=read();
// cout<<"t="<<t<<"\n";
while(t--)
{
n=read(),m=read(),l=read(),V=read();
for(int i=1;i<=n;i++)
d[i]=read(),v[i]=read(),a[i]=read();
for(int i=1;i<=m;i++)
p[i]=read();
sort(p+1,p+1+m);
int cnt=0;
for(int i=1;i<=n;i++)
{
if(d[i]>p[m])
continue;
if(a[i]>0)
{
if(v[i]<=V)
{
double s=1.0*(V*V-v[i]*v[i])/(2*a[i]);
int l=1,r=m;
int res=0;
if(1.0*d[i]+s>=p[m])
continue;
while(l<=r)
{
int mid=(l+r)>>1;
if(p[mid]<=1.0*d[i]+s)
res=mid,l=mid+1;
else
r=mid-1;
}
// cout<<1<<"\n";
if(res+1<=m)
sp[++cnt]={res+1,m};
}
else
{
int l=1,r=m;
int res=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(p[mid]<d[i])
res=mid,l=mid+1;
else
r=mid-1;
}
if(res+1<=m)
sp[++cnt]={res+1,m};
}
}
else if(a[i]<0)
{
if(v[i]<=V)
continue;
double s=1.0*(V*V-v[i]*v[i])/(2*a[i]);
// cout<<"s="<<s<<"\n";
// cout<<"V="<<V<<" v[i]="<<v[i]<<"\n";
int res=0;
int l=1,r=m;
if(d[i]>p[m])
continue;
while(l<=r)
{
int mid=(l+r)>>1;
if(p[mid]<d[i])
res=mid,l=mid+1;
else
r=mid-1;
}
int ll=res+1,rr;
l=1,r=m;
res=0;
// cout<<d[i]*1.0+s<<"\n";
while(l<=r)
{
int mid=(l+r)>>1;
if(p[mid]<d[i]*1.0+s)
res=mid,l=mid+1;
else
r=mid-1;
}
rr=res;
if(ll<=rr)
sp[++cnt]={ll,rr};
// cout<<"i="<<i<<"\n";
// cout<<sp[cnt].l<<" "<<sp[cnt].r<<"\n";
}
else if(v[i]>V)
{
int l=1,r=m;
int res=0;
if(d[i]>p[m])
continue;
while(l<=r)
{
int mid=(l+r)>>1;
if(p[mid]<d[i])
res=mid,l=mid+1;
else
r=mid-1;
}
if(res+1<=m)
sp[++cnt]={res+1,m};
}
}
cout<<cnt<<" ";
sort(sp+1,sp+1+cnt,cmp);
// for(int i=1;i<=cnt;i++)
// cout<<sp[i].l<<" "<<sp[i].r<<"\n";
int ans=0;
int last=0;
for(int i=1;i<=cnt;i++)
{
if(sp[i].l<=last)
continue;
last=sp[i].r;
ans++;
}
cout<<m-ans<<"\n";
}
return 0;
}