DBVH (dynamic bounding volume hierarchy) is a common approach to solving this need.
A BVH is just a tree of nodes containing one or more bounding volumes (e.g., circles/spheres) that are grouped together into a large bounding volume encompassing the children.
There are several ways to construct a BVH. Some are intended to produce optimal trees from a known set of objects while others can dynamically construct the BVH as objects are added, removed, moved, or resized (and this kind of dynamic BVH is probably what you need).
The classic resource that will cover this algorithm in detail (and many others) is [url=http://www.amazon.com/Real-Time-Collision-Detection-Interactive-Technology/dp/1558607323]Real-Time Collision Detection by Christer Ericson[/url]. Every game programmer should have a copy of this nearby for reference, IMO.
You can also consider a grid-based approach. For each circle, add an entry to all the grid locations that the circle overlaps with pointing to the detector object. When an object is added or moves, determine which grid locations it interacts with, find the set of all detector circles registered with those grid locations, and signal them. If your world is particularly large, you can consider a hash-based sparse grid rather than a 2D array.