From 727663b90d76095a135425c45efa9a408fa0470a Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 22:54:12 +0900 Subject: [PATCH 01/11] Rename Sp => in_stack --- lib/cpalgo/ds/minimum_queue.hpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/cpalgo/ds/minimum_queue.hpp b/lib/cpalgo/ds/minimum_queue.hpp index 6d9e02fc..802fc1e6 100644 --- a/lib/cpalgo/ds/minimum_queue.hpp +++ b/lib/cpalgo/ds/minimum_queue.hpp @@ -16,28 +16,28 @@ template > class MinimumQueue { private: - MinMaxStack Sp, Sr; + MinMaxStack in_stack, Sr; Less less; public: // Time: O(1) bool empty() const { - return Sp.empty() && Sr.empty(); + return in_stack.empty() && Sr.empty(); } // Time: O(1) size_t size() const { - return Sp.size() + Sr.size(); + return in_stack.size() + Sr.size(); } // Time: O(1) void push(T const& value) { - Sp.push(value); + in_stack.push(value); } // Time: O(N), amortized O(1) void pop() { if (Sr.empty()) { - while (!Sp.empty()) { - auto value = Sp.top(); - Sp.pop(); + while (!in_stack.empty()) { + auto value = in_stack.top(); + in_stack.pop(); Sr.push(value); } } @@ -46,23 +46,23 @@ class MinimumQueue { // Time: O(1) T front() const { if (Sr.empty()) { - return Sp.bottom(); + return in_stack.bottom(); } return Sr.top(); } // Time: O(1) T back() const { - if (!Sp.empty()) { - return Sp.top(); + if (!in_stack.empty()) { + return in_stack.top(); } return Sr.bottom(); } // Time: O(1) T minimum() const { - if (Sp.empty() || Sr.empty()) { - return Sp.empty() ? Sr.minimum() : Sp.minimum(); + if (in_stack.empty() || Sr.empty()) { + return in_stack.empty() ? Sr.minimum() : in_stack.minimum(); } else { - auto m1 = Sp.minimum(), m2 = Sr.minimum(); + auto m1 = in_stack.minimum(), m2 = Sr.minimum(); return less(m1, m2) ? m1 : m2; } } From 49e4e468bcf1c821b52d85190a422e2d16d68571 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 22:54:40 +0900 Subject: [PATCH 02/11] Rename Sr => out_stack --- lib/cpalgo/ds/minimum_queue.hpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/cpalgo/ds/minimum_queue.hpp b/lib/cpalgo/ds/minimum_queue.hpp index 802fc1e6..7f3977ef 100644 --- a/lib/cpalgo/ds/minimum_queue.hpp +++ b/lib/cpalgo/ds/minimum_queue.hpp @@ -16,17 +16,17 @@ template > class MinimumQueue { private: - MinMaxStack in_stack, Sr; + MinMaxStack in_stack, out_stack; Less less; public: // Time: O(1) bool empty() const { - return in_stack.empty() && Sr.empty(); + return in_stack.empty() && out_stack.empty(); } // Time: O(1) size_t size() const { - return in_stack.size() + Sr.size(); + return in_stack.size() + out_stack.size(); } // Time: O(1) void push(T const& value) { @@ -34,35 +34,35 @@ class MinimumQueue { } // Time: O(N), amortized O(1) void pop() { - if (Sr.empty()) { + if (out_stack.empty()) { while (!in_stack.empty()) { auto value = in_stack.top(); in_stack.pop(); - Sr.push(value); + out_stack.push(value); } } - Sr.pop(); + out_stack.pop(); } // Time: O(1) T front() const { - if (Sr.empty()) { + if (out_stack.empty()) { return in_stack.bottom(); } - return Sr.top(); + return out_stack.top(); } // Time: O(1) T back() const { if (!in_stack.empty()) { return in_stack.top(); } - return Sr.bottom(); + return out_stack.bottom(); } // Time: O(1) T minimum() const { - if (in_stack.empty() || Sr.empty()) { - return in_stack.empty() ? Sr.minimum() : in_stack.minimum(); + if (in_stack.empty() || out_stack.empty()) { + return in_stack.empty() ? out_stack.minimum() : in_stack.minimum(); } else { - auto m1 = in_stack.minimum(), m2 = Sr.minimum(); + auto m1 = in_stack.minimum(), m2 = out_stack.minimum(); return less(m1, m2) ? m1 : m2; } } From 0e441626678331c9154ba6e498c37e13b0f08c4c Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 22:57:46 +0900 Subject: [PATCH 03/11] Make minimum of MinimumQueue concise --- lib/cpalgo/ds/minimum_queue.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/cpalgo/ds/minimum_queue.hpp b/lib/cpalgo/ds/minimum_queue.hpp index 7f3977ef..6fe15e51 100644 --- a/lib/cpalgo/ds/minimum_queue.hpp +++ b/lib/cpalgo/ds/minimum_queue.hpp @@ -59,8 +59,10 @@ class MinimumQueue { } // Time: O(1) T minimum() const { - if (in_stack.empty() || out_stack.empty()) { - return in_stack.empty() ? out_stack.minimum() : in_stack.minimum(); + if (in_stack.empty()) { + return out_stack.minimum(); + } else if (out_stack.empty()) { + return in_stack.minimum(); } else { auto m1 = in_stack.minimum(), m2 = out_stack.minimum(); return less(m1, m2) ? m1 : m2; From 9d91669c2a18807a9f9dc01eaeae8a38453d2e00 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:09:57 +0900 Subject: [PATCH 04/11] MinimumQueue supports the maximum operation --- lib/cpalgo/ds/minimum_queue.hpp | 11 +++++++++ lib/cpalgo/ds/tests/minimum_queue_test.cpp | 27 +++++++++++++++------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/cpalgo/ds/minimum_queue.hpp b/lib/cpalgo/ds/minimum_queue.hpp index 6fe15e51..82109487 100644 --- a/lib/cpalgo/ds/minimum_queue.hpp +++ b/lib/cpalgo/ds/minimum_queue.hpp @@ -68,4 +68,15 @@ class MinimumQueue { return less(m1, m2) ? m1 : m2; } } + // Time: O(1) + T maximum() const { + if (in_stack.empty()) { + return out_stack.maximum(); + } else if (out_stack.empty()) { + return in_stack.maximum(); + } else { + auto m1 = in_stack.maximum(), m2 = out_stack.maximum(); + return less(m1, m2) ? m2 : m1; + } + } }; \ No newline at end of file diff --git a/lib/cpalgo/ds/tests/minimum_queue_test.cpp b/lib/cpalgo/ds/tests/minimum_queue_test.cpp index 5b0db992..0851431c 100644 --- a/lib/cpalgo/ds/tests/minimum_queue_test.cpp +++ b/lib/cpalgo/ds/tests/minimum_queue_test.cpp @@ -16,6 +16,7 @@ TEST(MinimumQueueTest, ShouldPushItems) { EXPECT_FALSE(q.empty()); EXPECT_EQ(1ULL, q.size()); EXPECT_EQ(2, q.minimum()); + EXPECT_EQ(2, q.maximum()); EXPECT_EQ(2, q.front()); EXPECT_EQ(2, q.back()); @@ -23,6 +24,7 @@ TEST(MinimumQueueTest, ShouldPushItems) { EXPECT_FALSE(q.empty()); EXPECT_EQ(2ULL, q.size()); EXPECT_EQ(1, q.minimum()); + EXPECT_EQ(2, q.maximum()); EXPECT_EQ(2, q.front()); EXPECT_EQ(1, q.back()); @@ -30,6 +32,7 @@ TEST(MinimumQueueTest, ShouldPushItems) { EXPECT_FALSE(q.empty()); EXPECT_EQ(3ULL, q.size()); EXPECT_EQ(1, q.minimum()); + EXPECT_EQ(3, q.maximum()); EXPECT_EQ(2, q.front()); EXPECT_EQ(3, q.back()); } @@ -37,28 +40,31 @@ TEST(MinimumQueueTest, ShouldPushItems) { TEST(MinimumQueueTest, ShouldPopItems) { MinimumQueue q; - q.push(2); - q.push(1); q.push(3); + q.push(1); + q.push(2); EXPECT_FALSE(q.empty()); EXPECT_EQ(3ULL, q.size()); EXPECT_EQ(1, q.minimum()); - EXPECT_EQ(2, q.front()); - EXPECT_EQ(3, q.back()); + EXPECT_EQ(3, q.maximum()); + EXPECT_EQ(3, q.front()); + EXPECT_EQ(2, q.back()); q.pop(); EXPECT_FALSE(q.empty()); EXPECT_EQ(2ULL, q.size()); EXPECT_EQ(1, q.minimum()); + EXPECT_EQ(2, q.maximum()); EXPECT_EQ(1, q.front()); - EXPECT_EQ(3, q.back()); + EXPECT_EQ(2, q.back()); q.pop(); EXPECT_FALSE(q.empty()); EXPECT_EQ(1ULL, q.size()); - EXPECT_EQ(3, q.minimum()); - EXPECT_EQ(3, q.front()); - EXPECT_EQ(3, q.back()); + EXPECT_EQ(2, q.minimum()); + EXPECT_EQ(2, q.maximum()); + EXPECT_EQ(2, q.front()); + EXPECT_EQ(2, q.back()); q.pop(); EXPECT_TRUE(q.empty()); @@ -76,6 +82,7 @@ TEST(MinimumQueueTest, ShouldPushAndPopItems) { EXPECT_FALSE(q.empty()); EXPECT_EQ(2ULL, q.size()); EXPECT_EQ(1, q.minimum()); + EXPECT_EQ(3, q.maximum()); EXPECT_EQ(1, q.front()); EXPECT_EQ(3, q.back()); @@ -86,6 +93,7 @@ TEST(MinimumQueueTest, ShouldPushAndPopItems) { EXPECT_FALSE(q.empty()); EXPECT_EQ(3ULL, q.size()); EXPECT_EQ(0, q.minimum()); + EXPECT_EQ(4, q.maximum()); EXPECT_EQ(3, q.front()); EXPECT_EQ(4, q.back()); } @@ -95,16 +103,19 @@ TEST(MinimumQueueTest, ShouldUseCustomComparator) { q.push(2); EXPECT_EQ(2, q.minimum()); + EXPECT_EQ(2, q.maximum()); EXPECT_EQ(2, q.front()); EXPECT_EQ(2, q.back()); q.push(3); EXPECT_EQ(3, q.minimum()); + EXPECT_EQ(2, q.maximum()); EXPECT_EQ(2, q.front()); EXPECT_EQ(3, q.back()); q.push(1); EXPECT_EQ(3, q.minimum()); + EXPECT_EQ(1, q.maximum()); EXPECT_EQ(2, q.front()); EXPECT_EQ(1, q.back()); } From d1298f6afe31b8dd84ae98d082c92dbd778160f6 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:10:12 +0900 Subject: [PATCH 05/11] MinimumQueue example supports the maximum operation --- lib/main/ds/main-minimum-queue.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/main/ds/main-minimum-queue.cpp b/lib/main/ds/main-minimum-queue.cpp index 15ea2daf..119a32fd 100644 --- a/lib/main/ds/main-minimum-queue.cpp +++ b/lib/main/ds/main-minimum-queue.cpp @@ -36,6 +36,11 @@ void action_minimum() { cout << minqueue.minimum() << endl; } +void action_maximum() { + if (minqueue.empty()) return; + cout << minqueue.maximum() << endl; +} + void setup(string& header, map& commands) { header = "Minimum Stack"; commands["init"] = { "init", action_init }; @@ -44,4 +49,5 @@ void setup(string& header, map& commands) { commands["front"] = { "front", action_front }; commands["back"] = { "back", action_back }; commands["min"] = { "min", action_minimum }; + commands["max"] = { "max", action_maximum }; } \ No newline at end of file From 3cf98f0853c3dafb852c5e100cd0b44daff14d98 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:14:52 +0900 Subject: [PATCH 06/11] Rename MinimumQueue => MinMaxQueue --- lib/cpalgo/ds/minimum_queue.hpp | 4 ++-- lib/cpalgo/ds/tests/minimum_queue_test.cpp | 20 ++++++++--------- lib/main/ds/main-minimum-queue.cpp | 26 +++++++++++----------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/cpalgo/ds/minimum_queue.hpp b/lib/cpalgo/ds/minimum_queue.hpp index 82109487..4d9cc08d 100644 --- a/lib/cpalgo/ds/minimum_queue.hpp +++ b/lib/cpalgo/ds/minimum_queue.hpp @@ -6,7 +6,7 @@ #include "minmax_stack.hpp" -// MinimumQueue +// MinMaxQueue // // Space: O(N) // @@ -14,7 +14,7 @@ // - https://onlinejudge.u-aizu.ac.jp/problems/DSL_3_D // template > -class MinimumQueue { +class MinMaxQueue { private: MinMaxStack in_stack, out_stack; Less less; diff --git a/lib/cpalgo/ds/tests/minimum_queue_test.cpp b/lib/cpalgo/ds/tests/minimum_queue_test.cpp index 0851431c..4e51c356 100644 --- a/lib/cpalgo/ds/tests/minimum_queue_test.cpp +++ b/lib/cpalgo/ds/tests/minimum_queue_test.cpp @@ -3,14 +3,14 @@ #include "cpalgo/ds/minimum_queue.hpp" -TEST(MinimumQueueTest, IsEmptyInitially) { - MinimumQueue q; +TEST(MinMaxQueueTest, IsEmptyInitially) { + MinMaxQueue q; EXPECT_TRUE(q.empty()); EXPECT_EQ(0ULL, q.size()); } -TEST(MinimumQueueTest, ShouldPushItems) { - MinimumQueue q; +TEST(MinMaxQueueTest, ShouldPushItems) { + MinMaxQueue q; q.push(2); EXPECT_FALSE(q.empty()); @@ -37,8 +37,8 @@ TEST(MinimumQueueTest, ShouldPushItems) { EXPECT_EQ(3, q.back()); } -TEST(MinimumQueueTest, ShouldPopItems) { - MinimumQueue q; +TEST(MinMaxQueueTest, ShouldPopItems) { + MinMaxQueue q; q.push(3); q.push(1); @@ -71,8 +71,8 @@ TEST(MinimumQueueTest, ShouldPopItems) { EXPECT_EQ(0ULL, q.size()); } -TEST(MinimumQueueTest, ShouldPushAndPopItems) { - MinimumQueue q; +TEST(MinMaxQueueTest, ShouldPushAndPopItems) { + MinMaxQueue q; q.push(2); q.pop(); @@ -98,8 +98,8 @@ TEST(MinimumQueueTest, ShouldPushAndPopItems) { EXPECT_EQ(4, q.back()); } -TEST(MinimumQueueTest, ShouldUseCustomComparator) { - MinimumQueue> q; +TEST(MinMaxQueueTest, ShouldUseCustomComparator) { + MinMaxQueue> q; q.push(2); EXPECT_EQ(2, q.minimum()); diff --git a/lib/main/ds/main-minimum-queue.cpp b/lib/main/ds/main-minimum-queue.cpp index 119a32fd..bf1580d2 100644 --- a/lib/main/ds/main-minimum-queue.cpp +++ b/lib/main/ds/main-minimum-queue.cpp @@ -4,41 +4,41 @@ using namespace std; -MinimumQueue minqueue; +MinMaxQueue minmax_queue; void action_init() { - minqueue = MinimumQueue(); + minmax_queue = MinMaxQueue(); } void action_push() { int value; cin >> value; - minqueue.push(value); + minmax_queue.push(value); } void action_pop() { - if (minqueue.empty()) return; - minqueue.pop(); + if (minmax_queue.empty()) return; + minmax_queue.pop(); } void action_front() { - if (minqueue.empty()) return; - cout << minqueue.front() << endl; + if (minmax_queue.empty()) return; + cout << minmax_queue.front() << endl; } void action_back() { - if (minqueue.empty()) return; - cout << minqueue.back() << endl; + if (minmax_queue.empty()) return; + cout << minmax_queue.back() << endl; } void action_minimum() { - if (minqueue.empty()) return; - cout << minqueue.minimum() << endl; + if (minmax_queue.empty()) return; + cout << minmax_queue.minimum() << endl; } void action_maximum() { - if (minqueue.empty()) return; - cout << minqueue.maximum() << endl; + if (minmax_queue.empty()) return; + cout << minmax_queue.maximum() << endl; } void setup(string& header, map& commands) { From d9ace7e9fed0af5cc800fad1589491b501e27b91 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:16:13 +0900 Subject: [PATCH 07/11] Rename minimum_queue.hpp => minmax_queue.hpp --- lib/cpalgo/ds/{minimum_queue.hpp => minmax_queue.hpp} | 0 lib/cpalgo/ds/tests/minimum_queue_test.cpp | 2 +- lib/main/ds/main-minimum-queue.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename lib/cpalgo/ds/{minimum_queue.hpp => minmax_queue.hpp} (100%) diff --git a/lib/cpalgo/ds/minimum_queue.hpp b/lib/cpalgo/ds/minmax_queue.hpp similarity index 100% rename from lib/cpalgo/ds/minimum_queue.hpp rename to lib/cpalgo/ds/minmax_queue.hpp diff --git a/lib/cpalgo/ds/tests/minimum_queue_test.cpp b/lib/cpalgo/ds/tests/minimum_queue_test.cpp index 4e51c356..9f4f3c74 100644 --- a/lib/cpalgo/ds/tests/minimum_queue_test.cpp +++ b/lib/cpalgo/ds/tests/minimum_queue_test.cpp @@ -1,6 +1,6 @@ #include #include "gtest/gtest.h" -#include "cpalgo/ds/minimum_queue.hpp" +#include "cpalgo/ds/minmax_queue.hpp" TEST(MinMaxQueueTest, IsEmptyInitially) { diff --git a/lib/main/ds/main-minimum-queue.cpp b/lib/main/ds/main-minimum-queue.cpp index bf1580d2..27a686f1 100644 --- a/lib/main/ds/main-minimum-queue.cpp +++ b/lib/main/ds/main-minimum-queue.cpp @@ -1,6 +1,6 @@ #include #include "template/template-main.hpp" -#include "cpalgo/ds/minimum_queue.hpp" +#include "cpalgo/ds/minmax_queue.hpp" using namespace std; From 5d204a1f3a6e861128fd3089364db127d867ca5e Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:16:59 +0900 Subject: [PATCH 08/11] Rename minimum_queue_test.cpp => minmax_queue_test.cpp --- .../ds/tests/{minimum_queue_test.cpp => minmax_queue_test.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/cpalgo/ds/tests/{minimum_queue_test.cpp => minmax_queue_test.cpp} (100%) diff --git a/lib/cpalgo/ds/tests/minimum_queue_test.cpp b/lib/cpalgo/ds/tests/minmax_queue_test.cpp similarity index 100% rename from lib/cpalgo/ds/tests/minimum_queue_test.cpp rename to lib/cpalgo/ds/tests/minmax_queue_test.cpp From 112872ed1809c8bb7282daf0c9d96028ebb10c29 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:17:47 +0900 Subject: [PATCH 09/11] Rename main-minimum-queue.cpp => main-minmax-queue.cpp --- lib/main/ds/BUILD | 4 ++-- lib/main/ds/{main-minimum-queue.cpp => main-minmax-queue.cpp} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename lib/main/ds/{main-minimum-queue.cpp => main-minmax-queue.cpp} (100%) diff --git a/lib/main/ds/BUILD b/lib/main/ds/BUILD index 6f475e76..d0eb20e8 100644 --- a/lib/main/ds/BUILD +++ b/lib/main/ds/BUILD @@ -31,8 +31,8 @@ cc_binary( ) cc_binary( - name = "minimum-queue", - srcs = ["main-minimum-queue.cpp"], + name = "minmax-queue", + srcs = ["main-minmax-queue.cpp"], copts = COPTS, deps = DEPS, ) diff --git a/lib/main/ds/main-minimum-queue.cpp b/lib/main/ds/main-minmax-queue.cpp similarity index 100% rename from lib/main/ds/main-minimum-queue.cpp rename to lib/main/ds/main-minmax-queue.cpp From 5faa643c419f5de905450edbf9056856e05ca250 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:20:11 +0900 Subject: [PATCH 10/11] Update README - Use MinMax instead - Improve documents --- README.md | 2 +- lib/cpalgo/ds/README.md | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 044872f1..f6c6b521 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ This project contains my competitive programming library, examples, and solution * [Disjoint Set Union](/lib/cpalgo/ds/README.md#Disjoint-Set-Union) * [Binary Indexed Tree](/lib/cpalgo/ds/README.md#Binary-Indexed-Tree) -* [Minimum Queue](/lib/cpalgo/ds/README.md#Minimum-Queue) +* [MinMax Queue](/lib/cpalgo/ds/README.md#MinMax-Queue) * [MinMax Stack](/lib/cpalgo/ds/README.md#MinMax-Stack) * [Randomized Heap](/lib/cpalgo/ds/README.md#Randomized-Heap) * [Segment Tree](/lib/cpalgo/ds/README.md#Segment-Tree) diff --git a/lib/cpalgo/ds/README.md b/lib/cpalgo/ds/README.md index fefd28c8..f46987dc 100644 --- a/lib/cpalgo/ds/README.md +++ b/lib/cpalgo/ds/README.md @@ -23,8 +23,9 @@ Binary Indexed Tree (Fenwick Tree) is a data structure. ### References in Japanese - [Binary Indexed Tree のはなし](http://hos.ac/slides/20140319_bit.pdf) -## Minimum Queue -🚧WIP +## MinMax Queue +A data structure that allows to store and retrieve elements in a first-in-first-out (FIFO) fashion. +This data structure also allows to retrieval of the minimum and maximum value efficiently. ## MinMax Stack A data structure that allows to store and retrieve elements in a last-in-first-out (LIFO) fashion. From 2502832b5ef173cf7837228cd69d984ac30f5897 Mon Sep 17 00:00:00 2001 From: Taichi Yamakawa Date: Mon, 28 Jun 2021 23:22:39 +0900 Subject: [PATCH 11/11] aoj/DSL3D To verify MinMaxQueue --- aoj/DSL/DSL3D/main_minimum-queue.cpp | 55 +++++++++++++++++----------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/aoj/DSL/DSL3D/main_minimum-queue.cpp b/aoj/DSL/DSL3D/main_minimum-queue.cpp index a618531f..1ffa1bae 100644 --- a/aoj/DSL/DSL3D/main_minimum-queue.cpp +++ b/aoj/DSL/DSL3D/main_minimum-queue.cpp @@ -56,58 +56,71 @@ class MinMaxStack { }; template > -class MinimumQueue { +class MinMaxQueue { private: - MinMaxStack Sp, Sr; + MinMaxStack in_stack, out_stack; Less less; public: // Time: O(1) bool empty() const { - return Sp.empty() && Sr.empty(); + return in_stack.empty() && out_stack.empty(); } // Time: O(1) size_t size() const { - return Sp.size() + Sr.size(); + return in_stack.size() + out_stack.size(); } // Time: O(1) void push(T const& value) { - Sp.push(value); + in_stack.push(value); } // Time: O(N), amortized O(1) void pop() { - if (Sr.empty()) { - while (!Sp.empty()) { - auto value = Sp.top(); - Sp.pop(); - Sr.push(value); + if (out_stack.empty()) { + while (!in_stack.empty()) { + auto value = in_stack.top(); + in_stack.pop(); + out_stack.push(value); } } - Sr.pop(); + out_stack.pop(); } // Time: O(1) T front() const { - if (Sr.empty()) { - return Sp.bottom(); + if (out_stack.empty()) { + return in_stack.bottom(); } - return Sr.top(); + return out_stack.top(); } // Time: O(1) T back() const { - if (!Sp.empty()) { - return Sp.top(); + if (!in_stack.empty()) { + return in_stack.top(); } - return Sr.bottom(); + return out_stack.bottom(); } // Time: O(1) T minimum() const { - if (Sp.empty() || Sr.empty()) { - return Sp.empty() ? Sr.minimum() : Sp.minimum(); + if (in_stack.empty()) { + return out_stack.minimum(); + } else if (out_stack.empty()) { + return in_stack.minimum(); } else { - auto m1 = Sp.minimum(), m2 = Sr.minimum(); + auto m1 = in_stack.minimum(), m2 = out_stack.minimum(); return less(m1, m2) ? m1 : m2; } } + // Time: O(1) + T maximum() const { + if (in_stack.empty()) { + return out_stack.maximum(); + } else if (out_stack.empty()) { + return in_stack.maximum(); + } else { + auto m1 = in_stack.maximum(), m2 = out_stack.maximum(); + return less(m1, m2) ? m2 : m1; + } + } }; using namespace std; @@ -123,7 +136,7 @@ int main() { cin >> array[i]; } - MinimumQueue Q; + MinMaxQueue Q; for (int i = 0; i < L; ++i) { Q.push(array[i]); }