CP Notebook

← all categories

Pbds Order Statistics Tree 92dca843

Order-statistics tree via GCC's built-in policy-based tree. find_by_order(k) gives the kth smallest element (0-indexed, as an iterator); order_of_key(x) gives the count of elements strictly less than x. Fastest option when it fits, but no split/merge and no direct erase-by-value (erase by iterator); for those, or for duplicate keys, use treap-ordered.h or splay-ordered-set.h instead.

Time: O(\log n) per operation. tested

content/data-structures/pbds-order-statistics-tree.h

#undef int  // pb_ds headers use 'int' internally; #define int long long corrupts them
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long
using namespace __gnu_pbds;

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

// usage:
//   ordered_set<int> s;
//   s.insert(5);
//   *s.find_by_order(0);   // smallest element
//   s.order_of_key(5);     // # elements < 5
//   s.erase(s.find_by_order(0));