From ac9b7cf4823f8b500f6e605b5811af6f760c98e9 Mon Sep 17 00:00:00 2001 From: fer22f <fer22f@gmail.com> Date: Tue, 17 Oct 2023 00:48:55 -0300 Subject: [PATCH] Adiciona k-elements --- fontes/k-elements.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 fontes/k-elements.h diff --git a/fontes/k-elements.h b/fontes/k-elements.h new file mode 100644 index 0000000..043baed --- /dev/null +++ b/fontes/k-elements.h @@ -0,0 +1,27 @@ +#include <ext/pb_ds/assoc_container.hpp> +#include <ext/pb_ds/tree_policy.hpp> +using namespace __gnu_pbds; +template <class T, class U = less<T>> +using ord_set = tree<T, null_type, U, rb_tree_tag, + tree_order_statistics_node_update>; +template <class C = less<>> +struct k_elements { + int k; ord_set<pair<ll, int>, C> s; ll sum; + k_elements(int k) : k(k), sum(0) {}; + void insert(int key, ll value) { + int l = s.order_of_key(make_pair(value, key)); + s.insert(make_pair(value, key)); + if (l >= k) { return; } + sum += value; + if (s.size() > k) + sum -= s.find_by_order(k)->first; + } + void remove(int key, ll value) { + if (s.order_of_key(make_pair(value, key)) < k) { + sum -= value; + if (s.size() > k) + sum += s.find_by_order(k)->first; + } + s.erase(s.find(make_pair(value, key))); + } +}; -- GitLab