← Home
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"sort"
)

const INF int64 = 9223372036854775807

type Item struct {
	m  int64
	s  int64
	p  int64
	rr int64
}

type Cap struct {
	p  int64
	rr int64
}

var items []Item
var masses []int64
var start []int
var end []int
var ptr []int
var seg []int64
var queue []Cap
var ans int

func nextInt64(data []byte, idx *int) int64 {
	for *idx < len(data) && data[*idx] <= ' ' {
		(*idx)++
	}
	sign := int64(1)
	if data[*idx] == '-' {
		sign = -1
		(*idx)++
	}
	var v int64
	for *idx < len(data) && data[*idx] >= '0' && data[*idx] <= '9' {
		v = v*10 + int64(data[*idx]-'0')
		(*idx)++
	}
	return v * sign
}

func min64(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

func build(node, l, r int) {
	if l == r {
		if ptr[l] < end[l] {
			seg[node] = items[ptr[l]].s
		} else {
			seg[node] = INF
		}
		return
	}
	mid := (l + r) >> 1
	build(node<<1, l, mid)
	build(node<<1|1, mid+1, r)
	seg[node] = min64(seg[node<<1], seg[node<<1|1])
}

func pop(node, l, r, qr int, lim int64) {
	if l > qr || seg[node] > lim {
		return
	}
	if l == r {
		g := l
		for ptr[g] < end[g] && items[ptr[g]].s <= lim {
			it := items[ptr[g]]
			queue = append(queue, Cap{p: it.p, rr: it.rr})
			ans++
			ptr[g]++
		}
		if ptr[g] < end[g] {
			seg[node] = items[ptr[g]].s
		} else {
			seg[node] = INF
		}
		return
	}
	mid := (l + r) >> 1
	pop(node<<1, l, mid, qr, lim)
	if qr > mid {
		pop(node<<1|1, mid+1, r, qr, lim)
	}
	seg[node] = min64(seg[node<<1], seg[node<<1|1])
}

func upperBound(a []int64, x int64) int {
	l, r := 0, len(a)
	for l < r {
		m := (l + r) >> 1
		if a[m] <= x {
			l = m + 1
		} else {
			r = m
		}
	}
	return l
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0

	x := nextInt64(data, &idx)
	y := nextInt64(data, &idx)
	p0 := nextInt64(data, &idx)
	r0 := nextInt64(data, &idx)
	n := int(nextInt64(data, &idx))

	items = make([]Item, n)
	r0sq := r0 * r0

	for i := 0; i < n; i++ {
		xi := nextInt64(data, &idx)
		yi := nextInt64(data, &idx)
		mi := nextInt64(data, &idx)
		pi := nextInt64(data, &idx)
		ri := nextInt64(data, &idx)
		dx := xi - x
		dy := yi - y
		s := dx*dx + dy*dy
		items[i] = Item{
			m:  mi,
			s:  s,
			p:  pi,
			rr: ri * ri,
		}
	}

	sort.Slice(items, func(i, j int) bool {
		if items[i].m != items[j].m {
			return items[i].m < items[j].m
		}
		return items[i].s < items[j].s
	})

	for i := 0; i < n; {
		j := i + 1
		for j < n && items[j].m == items[i].m {
			j++
		}
		masses = append(masses, items[i].m)
		start = append(start, i)
		end = append(end, j)
		i = j
	}

	ptr = make([]int, len(start))
	copy(ptr, start)
	seg = make([]int64, 4*len(start))
	build(1, 0, len(start)-1)

	queue = make([]Cap, 1, n+1)
	queue[0] = Cap{p: p0, rr: r0sq}

	for head := 0; head < len(queue); head++ {
		cur := queue[head]
		pos := upperBound(masses, cur.p) - 1
		if pos >= 0 {
			pop(1, 0, len(masses)-1, pos, cur.rr)
		}
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprint(w, ans)
	w.Flush()
}