ordered_set jest chyba najlepszym rozwiązaniem. Działa dla dowolnego typu tak długo jak ten typ ma zdefiniowany operator<. Możesz nawet zrobić template:
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
I wtedy dla structa np. Node robisz:
ordered_set<Node> ordS;
Inną opcją jest zaimplementowanie tego drzewem przedziałowym, ale problem pojawia się gdy wartości są z dużego zakresu np. [0, 1e18]. Wtedy pozostaje albo skorzystanie z kompresji, albo z dynamicznego drzewa przedziałowego, albo ze zbalansowanego BST np. drzewo AVL lub RB (Red-black tree). Tylko takie drzewa BST nie są proste w zaimplementowaniu w trakcie 5-godzinnego konkursu. A ordered_set korzysta już z RB tree (to wynika z rb_tree_tag)
Nie wydaje mi się, ze istnieje prostsze rozwiązanie działające w sqrt(n)