время выполнения быстрой сортировки сильно зависит от выбора разделяющего элемента. В сети есть много задач предлагающих "заломать" сортировку при условии, что разделяющим элементом выбирался средний по индексу, то есть m = x[(l+r)/2]. На одной олимпиаде был даже скандал. Жюри разумно заметило, что тесты они имеют предлагать любые соответсвующие условиям и что участник сам виноват, надо было ставить m = x[l+random(r-l+1)]
Мы кидаем `SpecialException`. Оно унаследовано от `GeneralException`, но принимается по значению, поэтому динамический тип e будет `GeneralException`, не `SpecialException`. В С++ community такой эффект называют ещё `slicing`.
Мы должны принимать `exception` по ссылке `catch (GeneralException& e)`, тогда динамический тип будет `SpecialException`, и программа выведет `S`.