For those who are confusing in C and D,please see if my comment helps
In Y process we are doing P(R), but not V(R). So basically someone has to do V(R) for Y.Now Y does P(R) on every iteration so someone has to do V(R) for every iteration of Y,Now who can signal V(R) ?Only X.
Now if any V(R) from X is lost then at least one iteration of Y can be blocked.
Lets us see why d is wrong:-Assume we want to compute for i=1,2
X does V(R),now R is set to 1.
Y does V(S) now S=1.
X does P(S) ,now S=0.
Now X has done one iteration and it starts the second iteration.
X does V(R), set R=1.
X does P(S), and goes to block queue of S.
Now here X is in 2nd iteration and Y is in first iteration.
Now x has computed a and 
Now Y does V(S),unblocks X.
X will exit now,it has computed a and a
Now Y does P(R) ,and set R=0 and compute b.
Now Y does second iteration and does V(s),and proceeds
Now does P(R) and goes to block state.
Now,there is no one to wake process Y
So thats why it is wrong.
Shortcut is to see that Y needs someone to do V(R) for its each iteration.X is doin but if some signal is lost,y will be blocked