cpp_logn_tree

#include <ext/pb_ds/assoc_container.hpp> // Core templates
#include <ext/pb_ds/tree_policy.hpp>     // Tree update policies

template <typename T>
using ordered_set = __gnu_pbds::tree<
    T,
    __gnu_pbds::null_type,
    std::less<>,
    __gnu_pbds::rb_tree_tag,
    __gnu_pbds::tree_order_statistics_node_update
>;

ordered_set<std::pair<int, int>> o; // define tree
auto it = o.find_by_order(k - 1); // get kth smallest element;
o.erase(it); // erase element
o.insert(...); // insert element
os.order_of_key(x); // get how many elements are less than x
o.lower_bound(x);
o.upper_bound(x);
o.size();
o.empty();
o.clear();
o.find(x); // find node, o.end() if not found