
Imagine the contestants as points in 3D space. B is worse than A iff all three his coordinates are greater than A's iff point B is in the correct octant centered at A.
Sort the points according to Z coordinate (the third contest).
Now we will do some sweeping according to the Z axis, starting at 0. Whenever you encounter a contestant during the sweep, you have already seen all contestants that can possibly be better than him. (The other ones have a larger Z coordinate.) Thus at this point you can decide whether this contestant is excellent.
To do this efficiently we need to realize the following fact: Fix the Z coordinate. For a single contestant that we already processed, the set of coordinates of worse contestants looks as follows:
  worse
  contestants
 A



0
For more contestants the set is the union of these sets:
 
 B
  worse
  contestants
 A D
 
 C

0
Once we encounter a new contestant during the sweep, there are two possibilities: Either he lies inside the set, or not. In the first case the contestant is eliminated immediately as he is not excellent and can not influence anything in the future. In the second case we will update the coastline. This includes adding the new point, and possibly removing some points that don't lie on the coastline any more:
 
 B
  worse
  contestants
 A D
 
  C
 E
0
To do both operations efficiently, keep the coastline as its vertices stored in an STL set. To process a new point you first search for it in the set to find the corresponding part of the coastline, check whether it is eliminated, and if not, erase the points it covers and add it to the set.
This is an O(N log N) solution and the set is the only nontrivial data structure in the program.
See http://www.algorithmist.com/index.php/LA_3525 for a similar task. 