@@ -9,21 +9,35 @@ using __gnu_pbds::rb_tree_tag;
9
9
using __gnu_pbds::tree_order_statistics_node_update;
10
10
using __gnu_pbds::null_type;
11
11
12
+ // _GLIBCXX_DEBUG must not be defined otherwise some internal check will fail
13
+ #undef _GLIBCXX_DEBUG
14
+
12
15
template <typename K, typename V, typename Comp = less<K>>
13
16
using indexed_map = tree<K, V, Comp, rb_tree_tag, tree_order_statistics_node_update>;
14
17
15
18
template <typename K, typename Comp = less<K>>
16
19
using indexed_set = indexed_map<K, null_type, Comp>;
17
20
21
+ // ¡¡IMPORTANT!! (for using less_equals<K>)
18
22
// using less_equals<K> makes lower_bound works as upper_bound and vice-versa
23
+ // for erase use: any.erase(any.find_by_order(any.order_of_key(val)));
24
+ // don't use .find() because it will always return .end()
19
25
template <typename K, typename V, typename Comp = less_equal<K>>
20
26
using indexed_multimap = indexed_map<K, V, Comp>;
21
27
22
28
template <typename K, typename Comp = less_equal<K>>
23
29
using indexed_multiset = indexed_map<K, null_type, Comp>;
24
30
31
+ // Reference: https://codeforces.com/blog/entry/11080
32
+
25
33
// Usage
34
+ // 1) Return the value of the idx index
26
35
// auto it = any.find_by_order(idx); (0-indexed)
27
36
// (*it).first, (*it).second
37
+ // 2) Get the index of the key value
28
38
// int index = any.order_of_key(key);
29
- // {1: 10, 2 :20, 5: 50}, order_of_key(3) -> return index 2
39
+ // {1: 10, 2 :20, 5: 50}
40
+ // any.order_of_key(2) -> return index 1
41
+ // any.order_of_key(3) -> return index 2
42
+ // 3) Correct way to use erase:
43
+ // any.erase(any.find_by_order(any.order_of_key(val)));
0 commit comments