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