Please concantrate on 2 things.. The steps which increases the costs and the steps which you see high consistent read counts.
I see a full table scan there -> TABLE ACCESS FULL XXABC_APPLICANT_COURSPREFS_TBL
Also I see other INDEX RANGE-scan like activities which have high elapsed times and cr counts..
The cost jumps after the second Nested loop, so you need to concantrate on the inputs of those nested loops ( the operations that are done with that nested loop) in the first place ->
These nested loops I mean ->
NESTED LOOPS (cr=12923 pr=0 pw=0 time=27217 us cost=592 size=126 card=1)
NESTED LOOPS (cr=1639 pr=0 pw=0 time=5551 us cost=450 size=6578 card=143)
So, your query has binds.
Your concurrent program probably executes it with different bind values.
It may be PLSQL loop that executes this query 842615 times.
In every execution, it normally fetches and get the rows.
This is the reasons for having 1 row for every fetch call.. That's normal.
Besides, you have ROWNUM<=:p_seats in your query.. When you have such rownum clauses in your query, it is normal and expected to see the operations like SORT ORDER BY STOPKEY and COUNT STOP KEY.
See my previous updates for the recommendations about this query's performance.