code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2.5e5+5;
struct node{
int x,y,m,p,r;
double dis;
}a[N];
int x,y,p,r,n,sq,ans,pos[N],maxn[N],h[N],vis[N];
double dist(double x,double y,double x2,double y2)
{return sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cin>>x>>y>>p>>r>>n;
sq=sqrt(n);
for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y>>a[i].m>>a[i].p>>a[i].r,pos[i]=(i-1)/sq+1,a[i].dis=dist(a[i].x,a[i].y,x,y);
sort(a+1,a+1+n,[](node x,node y){return x.m<y.m;});
for(int i=1;i<=pos[n];i++)sort(a+(i-1)*sq+1,a+i*sq+1,[](node x,node y){return x.dis<y.dis;});
for(int i=1;i<=n;i++)h[i]=1,maxn[pos[i]]=max(maxn[pos[i]],a[i].m);
queue<node>q;
q.push((node){x,y,0,p,r});
while(!q.empty())
{
node t=q.front();q.pop();
ans++;
for(int i=1;i<=pos[n];i++)
{
if(maxn[i]<=t.p)
{
for(;pos[h[i]]==i;h[i]++)
{
if(vis[h[i]])continue;
if(a[h[i]].dis<=t.r)
{
q.push(a[h[i]]);
vis[h[i]]=true;
}
else break;
}
}
else {
for(int j=(i-1)*sq+1;j<=i*sq;j++)
{
if(vis[j])continue;
if(a[j].dis<=t.r&&a[j].m<=t.p)
{
q.push(a[j]);
vis[j]=1;
}
}
break;
}
}
}
cout<<ans;
return 0;
}