Limiting memory usage while keeping score
Your idea of an array of size $c_3$ is a good one.
But you can do better. First, since you need only be withing a range $r$,
you can use an array of size $c_3/r$, rounding upward, and just mark the entry
corresponding to the integer segment you fall in (there may be some details to work out).

Then, rather than using an array, if it is still too large, you can
build a binary structure, so that you create only the array entries you
need. Each node of the binary structure corresponds to a range of
consecutive entries. 


    Then, you can reduce the memory requirement further by merging contiguous ranges where all entries have been hit, and rebalance the tree.

 Of course, there is a $\log_2 c_3/r$ price in access time. But this cost is limited by the tree shrinking as it gets full.