I don't think there's an easy solution.
I would address that by taking every circle in turn, and performing a boolean subtraction of all other circles. (The circles that are far enough - R0 + R1 < D12 - will not interfere.)
After pieces have been eaten, a circle becomes a curvilinear polygon made of circular arcs, or a set of such polygons, as connexity can be broken. A polygon can be represented by the list of circles that contribute an arc of its outline, and the arcs endpoints are defined by the common intersection of two consecutive neighbors, or of the target circle and a neighbor. Note that the same neighbor can appear several times.
To make things a little more gory, the polygons can have holes, which you need to represent as well.
Then a crucial operation is the subtraction of a circle from a curvilinear polygon. You need to detect the arcs that are wholly inside the new circle and those that cross it. After getting the remaining portions of the arcs, you need to rearrange the remaining arcs and the new one(s).
I guess that all these operations can be built from a single primitive that finds the portion of an arc (defined by three circles) that is inside a disk.
