From d463492127cef9b7653e31b61704a1a7bc5150a0 Mon Sep 17 00:00:00 2001 From: EFanZh Date: Sat, 23 Nov 2024 10:01:15 +0800 Subject: [PATCH] Add problem 2336: Smallest Number in Infinite Set --- src/lib.rs | 1 + .../binary_heap.rs | 84 ++ .../mod.rs | 823 ++++++++++++++++++ 3 files changed, 908 insertions(+) create mode 100644 src/problem_2336_smallest_number_in_infinite_set/binary_heap.rs create mode 100644 src/problem_2336_smallest_number_in_infinite_set/mod.rs diff --git a/src/lib.rs b/src/lib.rs index 246b9cca..1ca5ded7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1731,6 +1731,7 @@ pub mod problem_2325_decode_the_message; pub mod problem_2326_spiral_matrix_iv; pub mod problem_2331_evaluate_boolean_binary_tree; pub mod problem_2335_minimum_amount_of_time_to_fill_cups; +pub mod problem_2336_smallest_number_in_infinite_set; #[cfg(test)] mod test_utilities; diff --git a/src/problem_2336_smallest_number_in_infinite_set/binary_heap.rs b/src/problem_2336_smallest_number_in_infinite_set/binary_heap.rs new file mode 100644 index 00000000..3b7ff602 --- /dev/null +++ b/src/problem_2336_smallest_number_in_infinite_set/binary_heap.rs @@ -0,0 +1,84 @@ +// ------------------------------------------------------ snip ------------------------------------------------------ // + +use std::cmp::{Ordering, Reverse}; +use std::collections::{BinaryHeap, HashSet}; + +pub struct SmallestInfiniteSet { + front: BinaryHeap>, + front_values: HashSet, + back: u32, +} + +impl SmallestInfiniteSet { + fn new() -> Self { + Self { + front: BinaryHeap::new(), + front_values: HashSet::new(), + back: 0, + } + } + + fn pop_smallest(&mut self) -> i32 { + if let Some(Reverse(value)) = self.front.pop() { + if value < self.back { + self.front_values.remove(&value); + + return value as _; + } + + self.front.clear(); + } + + self.back += 1; + + self.back as _ + } + + fn add_back(&mut self, num: i32) { + let num = num as u32; + + match num.cmp(&self.back) { + Ordering::Less => { + if self.front_values.insert(num) { + self.front.push(Reverse(num)); + } + } + Ordering::Equal => { + self.front_values.remove(&num); + + loop { + self.back -= 1; + + if !self.front_values.remove(&self.back) { + break; + } + } + } + Ordering::Greater => {} + } + } +} + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl super::SmallestInfiniteSet for SmallestInfiniteSet { + fn new() -> Self { + Self::new() + } + + fn pop_smallest(&mut self) -> i32 { + self.pop_smallest() + } + + fn add_back(&mut self, num: i32) { + self.add_back(num); + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_solution() { + super::super::tests::run::(); + } +} diff --git a/src/problem_2336_smallest_number_in_infinite_set/mod.rs b/src/problem_2336_smallest_number_in_infinite_set/mod.rs new file mode 100644 index 00000000..26d2187b --- /dev/null +++ b/src/problem_2336_smallest_number_in_infinite_set/mod.rs @@ -0,0 +1,823 @@ +pub mod binary_heap; + +pub trait SmallestInfiniteSet { + fn new() -> Self; + fn pop_smallest(&mut self) -> i32; + fn add_back(&mut self, num: i32); +} + +#[cfg(test)] +mod tests { + use super::SmallestInfiniteSet; + + enum Operation { + PopSmallest(i32), + AddBack(i32), + } + + const EXTRA_TEST_CASE_1: &[Operation] = &[ + Operation::AddBack(84), + Operation::AddBack(550), + Operation::AddBack(88), + Operation::PopSmallest(1), + Operation::PopSmallest(2), + Operation::AddBack(152), + Operation::PopSmallest(3), + Operation::AddBack(413), + Operation::PopSmallest(4), + Operation::PopSmallest(5), + Operation::AddBack(359), + Operation::AddBack(33), + Operation::PopSmallest(6), + Operation::AddBack(321), + Operation::PopSmallest(7), + Operation::PopSmallest(8), + Operation::PopSmallest(9), + Operation::PopSmallest(10), + Operation::PopSmallest(11), + Operation::PopSmallest(12), + Operation::PopSmallest(13), + Operation::PopSmallest(14), + Operation::AddBack(827), + Operation::AddBack(839), + Operation::AddBack(618), + Operation::AddBack(165), + Operation::PopSmallest(15), + Operation::AddBack(89), + Operation::AddBack(783), + Operation::AddBack(708), + Operation::PopSmallest(16), + Operation::PopSmallest(17), + Operation::PopSmallest(18), + Operation::PopSmallest(19), + Operation::PopSmallest(20), + Operation::PopSmallest(21), + Operation::AddBack(816), + Operation::PopSmallest(22), + Operation::PopSmallest(23), + Operation::PopSmallest(24), + Operation::PopSmallest(25), + Operation::PopSmallest(26), + Operation::PopSmallest(27), + Operation::AddBack(869), + Operation::AddBack(34), + Operation::AddBack(707), + Operation::AddBack(841), + Operation::AddBack(957), + Operation::AddBack(485), + Operation::AddBack(527), + Operation::AddBack(109), + Operation::AddBack(254), + Operation::AddBack(799), + Operation::AddBack(442), + Operation::PopSmallest(28), + Operation::PopSmallest(29), + Operation::PopSmallest(30), + Operation::AddBack(318), + Operation::PopSmallest(31), + Operation::PopSmallest(32), + Operation::AddBack(980), + Operation::PopSmallest(33), + Operation::AddBack(202), + Operation::PopSmallest(34), + Operation::PopSmallest(35), + Operation::AddBack(993), + Operation::AddBack(119), + Operation::PopSmallest(36), + Operation::PopSmallest(37), + Operation::AddBack(188), + Operation::PopSmallest(38), + Operation::PopSmallest(39), + Operation::PopSmallest(40), + Operation::AddBack(855), + Operation::PopSmallest(41), + Operation::PopSmallest(42), + Operation::PopSmallest(43), + Operation::PopSmallest(44), + Operation::PopSmallest(45), + Operation::AddBack(630), + Operation::PopSmallest(46), + Operation::PopSmallest(47), + Operation::PopSmallest(48), + Operation::PopSmallest(49), + Operation::AddBack(435), + Operation::AddBack(67), + Operation::AddBack(681), + Operation::AddBack(396), + Operation::AddBack(73), + Operation::PopSmallest(50), + Operation::AddBack(218), + Operation::AddBack(179), + Operation::AddBack(868), + Operation::AddBack(157), + Operation::AddBack(435), + Operation::AddBack(334), + Operation::PopSmallest(51), + Operation::AddBack(514), + Operation::AddBack(883), + Operation::AddBack(641), + Operation::AddBack(325), + Operation::AddBack(60), + Operation::AddBack(926), + Operation::AddBack(67), + Operation::AddBack(667), + Operation::AddBack(709), + Operation::AddBack(134), + Operation::AddBack(763), + Operation::AddBack(534), + Operation::PopSmallest(52), + Operation::AddBack(899), + Operation::PopSmallest(53), + Operation::AddBack(389), + Operation::PopSmallest(54), + Operation::AddBack(24), + Operation::PopSmallest(24), + Operation::AddBack(769), + Operation::AddBack(473), + Operation::AddBack(51), + Operation::PopSmallest(51), + Operation::PopSmallest(55), + Operation::AddBack(479), + Operation::PopSmallest(56), + Operation::AddBack(471), + Operation::AddBack(991), + Operation::AddBack(787), + Operation::AddBack(288), + Operation::PopSmallest(57), + Operation::AddBack(599), + Operation::AddBack(455), + Operation::PopSmallest(58), + Operation::PopSmallest(59), + Operation::PopSmallest(60), + Operation::PopSmallest(61), + Operation::AddBack(785), + Operation::AddBack(991), + Operation::PopSmallest(62), + Operation::PopSmallest(63), + Operation::PopSmallest(64), + Operation::PopSmallest(65), + Operation::AddBack(663), + Operation::PopSmallest(66), + Operation::AddBack(990), + Operation::AddBack(484), + Operation::AddBack(246), + Operation::PopSmallest(67), + Operation::PopSmallest(68), + Operation::AddBack(356), + Operation::PopSmallest(69), + Operation::AddBack(618), + Operation::PopSmallest(70), + Operation::AddBack(90), + Operation::PopSmallest(71), + Operation::PopSmallest(72), + Operation::AddBack(27), + Operation::AddBack(466), + Operation::PopSmallest(27), + Operation::AddBack(493), + Operation::PopSmallest(73), + Operation::AddBack(579), + Operation::AddBack(170), + Operation::PopSmallest(74), + Operation::AddBack(42), + Operation::PopSmallest(42), + Operation::PopSmallest(75), + Operation::PopSmallest(76), + Operation::AddBack(645), + Operation::AddBack(710), + Operation::PopSmallest(77), + Operation::PopSmallest(78), + Operation::AddBack(458), + Operation::AddBack(464), + Operation::PopSmallest(79), + Operation::PopSmallest(80), + Operation::AddBack(418), + Operation::PopSmallest(81), + Operation::AddBack(753), + Operation::PopSmallest(82), + Operation::AddBack(441), + Operation::PopSmallest(83), + Operation::PopSmallest(84), + Operation::AddBack(820), + Operation::AddBack(395), + Operation::PopSmallest(85), + Operation::AddBack(731), + Operation::AddBack(19), + Operation::PopSmallest(19), + Operation::PopSmallest(86), + Operation::PopSmallest(87), + Operation::PopSmallest(88), + Operation::PopSmallest(89), + Operation::PopSmallest(90), + Operation::PopSmallest(91), + Operation::PopSmallest(92), + Operation::AddBack(941), + Operation::AddBack(917), + Operation::PopSmallest(93), + Operation::AddBack(865), + Operation::AddBack(537), + Operation::PopSmallest(94), + Operation::PopSmallest(95), + Operation::AddBack(52), + Operation::PopSmallest(52), + Operation::AddBack(604), + Operation::PopSmallest(96), + Operation::AddBack(963), + Operation::AddBack(862), + Operation::PopSmallest(97), + Operation::AddBack(162), + Operation::PopSmallest(98), + Operation::PopSmallest(99), + Operation::AddBack(89), + Operation::PopSmallest(89), + Operation::PopSmallest(100), + Operation::PopSmallest(101), + Operation::PopSmallest(102), + Operation::PopSmallest(103), + Operation::PopSmallest(104), + Operation::AddBack(115), + Operation::AddBack(691), + Operation::PopSmallest(105), + Operation::AddBack(807), + Operation::PopSmallest(106), + Operation::PopSmallest(107), + Operation::PopSmallest(108), + Operation::AddBack(529), + Operation::AddBack(846), + Operation::AddBack(529), + Operation::AddBack(255), + Operation::PopSmallest(109), + Operation::AddBack(799), + Operation::AddBack(395), + Operation::AddBack(759), + Operation::PopSmallest(110), + Operation::AddBack(717), + Operation::PopSmallest(111), + Operation::AddBack(728), + Operation::AddBack(483), + Operation::PopSmallest(112), + Operation::PopSmallest(113), + Operation::PopSmallest(114), + Operation::PopSmallest(115), + Operation::PopSmallest(116), + Operation::PopSmallest(117), + Operation::PopSmallest(118), + Operation::PopSmallest(119), + Operation::AddBack(140), + Operation::AddBack(462), + Operation::AddBack(537), + Operation::AddBack(287), + Operation::PopSmallest(120), + Operation::PopSmallest(121), + Operation::PopSmallest(122), + Operation::AddBack(180), + Operation::PopSmallest(123), + Operation::PopSmallest(124), + Operation::PopSmallest(125), + Operation::AddBack(305), + Operation::AddBack(856), + Operation::AddBack(636), + Operation::AddBack(561), + Operation::AddBack(178), + Operation::PopSmallest(126), + Operation::AddBack(660), + Operation::PopSmallest(127), + Operation::PopSmallest(128), + Operation::AddBack(703), + Operation::AddBack(578), + Operation::PopSmallest(129), + Operation::AddBack(902), + Operation::AddBack(99), + Operation::PopSmallest(99), + Operation::AddBack(477), + Operation::AddBack(259), + Operation::AddBack(768), + Operation::PopSmallest(130), + Operation::AddBack(726), + Operation::PopSmallest(131), + Operation::PopSmallest(132), + Operation::PopSmallest(133), + Operation::PopSmallest(134), + Operation::AddBack(68), + Operation::AddBack(463), + Operation::PopSmallest(68), + Operation::AddBack(984), + Operation::PopSmallest(135), + Operation::AddBack(511), + Operation::PopSmallest(136), + Operation::PopSmallest(137), + Operation::PopSmallest(138), + Operation::AddBack(401), + Operation::AddBack(106), + Operation::AddBack(91), + Operation::PopSmallest(91), + Operation::AddBack(671), + Operation::PopSmallest(106), + Operation::AddBack(233), + Operation::PopSmallest(139), + Operation::PopSmallest(140), + Operation::AddBack(94), + Operation::PopSmallest(94), + Operation::PopSmallest(141), + Operation::AddBack(777), + Operation::AddBack(451), + Operation::PopSmallest(142), + Operation::PopSmallest(143), + Operation::PopSmallest(144), + Operation::AddBack(868), + Operation::PopSmallest(145), + Operation::PopSmallest(146), + Operation::AddBack(133), + Operation::PopSmallest(133), + Operation::AddBack(249), + Operation::AddBack(128), + Operation::PopSmallest(128), + Operation::PopSmallest(147), + Operation::AddBack(942), + Operation::AddBack(991), + Operation::AddBack(406), + Operation::AddBack(886), + Operation::PopSmallest(148), + Operation::AddBack(55), + Operation::AddBack(470), + Operation::AddBack(247), + Operation::PopSmallest(55), + Operation::PopSmallest(149), + Operation::AddBack(943), + Operation::AddBack(68), + Operation::PopSmallest(68), + Operation::PopSmallest(150), + Operation::PopSmallest(151), + Operation::PopSmallest(152), + Operation::PopSmallest(153), + Operation::PopSmallest(154), + Operation::PopSmallest(155), + Operation::PopSmallest(156), + Operation::AddBack(108), + Operation::AddBack(488), + Operation::AddBack(685), + Operation::AddBack(315), + Operation::AddBack(832), + Operation::AddBack(952), + Operation::PopSmallest(108), + Operation::PopSmallest(157), + Operation::AddBack(208), + Operation::PopSmallest(158), + Operation::PopSmallest(159), + Operation::PopSmallest(160), + Operation::AddBack(460), + Operation::PopSmallest(161), + Operation::PopSmallest(162), + Operation::PopSmallest(163), + Operation::AddBack(189), + Operation::AddBack(437), + Operation::PopSmallest(164), + Operation::AddBack(642), + Operation::PopSmallest(165), + Operation::AddBack(316), + Operation::PopSmallest(166), + Operation::PopSmallest(167), + Operation::AddBack(356), + Operation::PopSmallest(168), + Operation::AddBack(138), + Operation::AddBack(628), + Operation::AddBack(520), + Operation::PopSmallest(138), + Operation::PopSmallest(169), + Operation::AddBack(771), + Operation::AddBack(42), + Operation::AddBack(549), + Operation::AddBack(751), + Operation::AddBack(17), + Operation::PopSmallest(17), + Operation::PopSmallest(42), + Operation::PopSmallest(170), + Operation::PopSmallest(171), + Operation::PopSmallest(172), + Operation::PopSmallest(173), + Operation::AddBack(13), + Operation::PopSmallest(13), + Operation::PopSmallest(174), + Operation::PopSmallest(175), + Operation::AddBack(270), + Operation::PopSmallest(176), + Operation::AddBack(210), + Operation::PopSmallest(177), + Operation::AddBack(764), + Operation::AddBack(27), + Operation::AddBack(419), + Operation::PopSmallest(27), + Operation::PopSmallest(178), + Operation::PopSmallest(179), + Operation::AddBack(957), + Operation::PopSmallest(180), + Operation::AddBack(996), + Operation::AddBack(546), + Operation::AddBack(32), + Operation::PopSmallest(32), + Operation::PopSmallest(181), + Operation::PopSmallest(182), + Operation::PopSmallest(183), + Operation::PopSmallest(184), + Operation::AddBack(10), + Operation::AddBack(412), + Operation::PopSmallest(10), + Operation::PopSmallest(185), + Operation::AddBack(690), + Operation::AddBack(220), + Operation::PopSmallest(186), + Operation::PopSmallest(187), + Operation::AddBack(873), + Operation::PopSmallest(188), + Operation::AddBack(219), + Operation::AddBack(296), + Operation::AddBack(647), + Operation::AddBack(936), + Operation::PopSmallest(189), + Operation::PopSmallest(190), + Operation::AddBack(56), + Operation::AddBack(946), + Operation::AddBack(897), + Operation::PopSmallest(56), + Operation::AddBack(579), + Operation::PopSmallest(191), + Operation::PopSmallest(192), + Operation::PopSmallest(193), + Operation::PopSmallest(194), + Operation::AddBack(333), + Operation::PopSmallest(195), + Operation::PopSmallest(196), + Operation::PopSmallest(197), + Operation::PopSmallest(198), + Operation::AddBack(92), + Operation::AddBack(212), + Operation::PopSmallest(92), + Operation::AddBack(80), + Operation::PopSmallest(80), + Operation::AddBack(289), + Operation::PopSmallest(199), + Operation::AddBack(494), + Operation::AddBack(907), + Operation::PopSmallest(200), + Operation::PopSmallest(201), + Operation::AddBack(512), + Operation::PopSmallest(202), + Operation::PopSmallest(203), + Operation::PopSmallest(204), + Operation::PopSmallest(205), + Operation::AddBack(552), + Operation::AddBack(745), + Operation::AddBack(874), + Operation::AddBack(633), + Operation::PopSmallest(206), + Operation::PopSmallest(207), + Operation::PopSmallest(208), + Operation::PopSmallest(209), + Operation::PopSmallest(210), + Operation::AddBack(656), + Operation::PopSmallest(211), + Operation::AddBack(989), + Operation::AddBack(479), + Operation::AddBack(797), + Operation::AddBack(807), + Operation::PopSmallest(212), + Operation::PopSmallest(213), + Operation::AddBack(509), + Operation::AddBack(280), + Operation::AddBack(591), + Operation::PopSmallest(214), + Operation::AddBack(3), + Operation::PopSmallest(3), + Operation::PopSmallest(215), + Operation::AddBack(16), + Operation::PopSmallest(16), + Operation::AddBack(796), + Operation::AddBack(726), + Operation::PopSmallest(216), + Operation::PopSmallest(217), + Operation::AddBack(125), + Operation::PopSmallest(125), + Operation::PopSmallest(218), + Operation::PopSmallest(219), + Operation::AddBack(217), + Operation::AddBack(908), + Operation::AddBack(58), + Operation::PopSmallest(58), + Operation::PopSmallest(217), + Operation::AddBack(432), + Operation::AddBack(692), + Operation::PopSmallest(220), + Operation::AddBack(23), + Operation::AddBack(512), + Operation::PopSmallest(23), + Operation::AddBack(554), + Operation::PopSmallest(221), + Operation::AddBack(249), + Operation::AddBack(953), + Operation::AddBack(662), + Operation::AddBack(143), + Operation::AddBack(808), + Operation::AddBack(627), + Operation::PopSmallest(143), + Operation::PopSmallest(222), + Operation::AddBack(255), + Operation::PopSmallest(223), + Operation::AddBack(952), + Operation::PopSmallest(224), + Operation::PopSmallest(225), + Operation::PopSmallest(226), + Operation::PopSmallest(227), + Operation::AddBack(467), + Operation::PopSmallest(228), + Operation::PopSmallest(229), + Operation::AddBack(852), + Operation::AddBack(41), + Operation::AddBack(302), + Operation::AddBack(730), + Operation::AddBack(644), + Operation::PopSmallest(41), + Operation::PopSmallest(230), + Operation::PopSmallest(231), + Operation::AddBack(383), + Operation::PopSmallest(232), + Operation::AddBack(510), + Operation::AddBack(540), + Operation::AddBack(194), + Operation::PopSmallest(194), + Operation::AddBack(558), + Operation::PopSmallest(233), + Operation::PopSmallest(234), + Operation::AddBack(676), + Operation::AddBack(662), + Operation::PopSmallest(235), + Operation::AddBack(940), + Operation::PopSmallest(236), + Operation::PopSmallest(237), + Operation::PopSmallest(238), + Operation::AddBack(312), + Operation::PopSmallest(239), + Operation::PopSmallest(240), + Operation::AddBack(93), + Operation::PopSmallest(93), + Operation::AddBack(434), + Operation::PopSmallest(241), + Operation::PopSmallest(242), + Operation::PopSmallest(243), + Operation::PopSmallest(244), + Operation::AddBack(150), + Operation::PopSmallest(150), + Operation::AddBack(338), + Operation::AddBack(575), + Operation::AddBack(731), + Operation::AddBack(710), + Operation::AddBack(610), + Operation::PopSmallest(245), + Operation::PopSmallest(246), + Operation::PopSmallest(247), + Operation::PopSmallest(248), + Operation::PopSmallest(249), + Operation::PopSmallest(250), + Operation::PopSmallest(251), + Operation::AddBack(938), + Operation::AddBack(563), + Operation::PopSmallest(252), + Operation::PopSmallest(253), + Operation::PopSmallest(254), + Operation::AddBack(734), + Operation::PopSmallest(255), + Operation::PopSmallest(256), + Operation::AddBack(245), + Operation::PopSmallest(245), + Operation::PopSmallest(257), + Operation::PopSmallest(258), + Operation::PopSmallest(259), + Operation::PopSmallest(260), + Operation::AddBack(173), + Operation::PopSmallest(173), + Operation::PopSmallest(261), + Operation::PopSmallest(262), + Operation::PopSmallest(263), + Operation::AddBack(439), + Operation::PopSmallest(264), + Operation::PopSmallest(265), + Operation::PopSmallest(266), + Operation::AddBack(451), + Operation::PopSmallest(267), + Operation::PopSmallest(268), + Operation::PopSmallest(269), + Operation::PopSmallest(270), + Operation::AddBack(924), + Operation::PopSmallest(271), + Operation::PopSmallest(272), + Operation::PopSmallest(273), + Operation::PopSmallest(274), + Operation::PopSmallest(275), + Operation::AddBack(33), + Operation::AddBack(498), + Operation::PopSmallest(33), + Operation::AddBack(80), + Operation::AddBack(296), + Operation::PopSmallest(80), + Operation::AddBack(391), + Operation::PopSmallest(276), + Operation::AddBack(39), + Operation::AddBack(522), + Operation::AddBack(487), + Operation::AddBack(119), + Operation::AddBack(940), + Operation::AddBack(999), + Operation::AddBack(337), + Operation::PopSmallest(39), + Operation::PopSmallest(119), + Operation::AddBack(406), + Operation::AddBack(696), + Operation::PopSmallest(277), + Operation::AddBack(493), + Operation::AddBack(642), + Operation::PopSmallest(278), + Operation::AddBack(841), + Operation::PopSmallest(279), + Operation::PopSmallest(280), + Operation::AddBack(369), + Operation::PopSmallest(281), + Operation::PopSmallest(282), + Operation::PopSmallest(283), + Operation::PopSmallest(284), + Operation::PopSmallest(285), + Operation::AddBack(396), + Operation::PopSmallest(286), + Operation::PopSmallest(287), + Operation::AddBack(20), + Operation::AddBack(328), + Operation::PopSmallest(20), + Operation::PopSmallest(288), + Operation::AddBack(158), + Operation::AddBack(751), + Operation::AddBack(686), + Operation::PopSmallest(158), + Operation::AddBack(233), + Operation::PopSmallest(233), + Operation::PopSmallest(289), + Operation::PopSmallest(290), + Operation::AddBack(595), + Operation::AddBack(984), + Operation::PopSmallest(291), + Operation::AddBack(676), + Operation::AddBack(101), + Operation::AddBack(75), + Operation::AddBack(397), + Operation::PopSmallest(75), + Operation::PopSmallest(101), + Operation::AddBack(128), + Operation::PopSmallest(128), + Operation::AddBack(242), + Operation::PopSmallest(242), + Operation::AddBack(76), + Operation::AddBack(526), + Operation::AddBack(956), + Operation::AddBack(377), + Operation::AddBack(477), + Operation::AddBack(957), + Operation::AddBack(335), + Operation::PopSmallest(76), + Operation::PopSmallest(292), + Operation::PopSmallest(293), + Operation::PopSmallest(294), + Operation::AddBack(622), + Operation::AddBack(815), + Operation::AddBack(381), + Operation::AddBack(490), + Operation::PopSmallest(295), + Operation::AddBack(908), + Operation::AddBack(231), + Operation::PopSmallest(231), + Operation::PopSmallest(296), + Operation::AddBack(504), + Operation::AddBack(767), + Operation::AddBack(419), + Operation::PopSmallest(297), + Operation::PopSmallest(298), + Operation::PopSmallest(299), + Operation::PopSmallest(300), + Operation::PopSmallest(301), + Operation::PopSmallest(302), + Operation::PopSmallest(303), + Operation::PopSmallest(304), + Operation::PopSmallest(305), + Operation::AddBack(23), + Operation::PopSmallest(23), + Operation::AddBack(408), + Operation::PopSmallest(306), + Operation::PopSmallest(307), + Operation::AddBack(760), + Operation::AddBack(730), + Operation::PopSmallest(308), + Operation::AddBack(319), + Operation::PopSmallest(309), + Operation::AddBack(605), + Operation::PopSmallest(310), + Operation::PopSmallest(311), + Operation::AddBack(939), + Operation::AddBack(638), + Operation::PopSmallest(312), + Operation::PopSmallest(313), + Operation::AddBack(250), + Operation::PopSmallest(250), + Operation::AddBack(513), + Operation::AddBack(903), + Operation::PopSmallest(314), + Operation::PopSmallest(315), + Operation::AddBack(251), + Operation::PopSmallest(251), + Operation::PopSmallest(316), + Operation::PopSmallest(317), + Operation::PopSmallest(318), + Operation::PopSmallest(319), + Operation::PopSmallest(320), + Operation::AddBack(649), + Operation::AddBack(5), + Operation::AddBack(152), + Operation::PopSmallest(5), + Operation::PopSmallest(152), + Operation::AddBack(716), + Operation::AddBack(873), + Operation::AddBack(120), + Operation::AddBack(153), + Operation::PopSmallest(120), + Operation::PopSmallest(153), + Operation::PopSmallest(321), + Operation::AddBack(312), + Operation::AddBack(747), + Operation::AddBack(533), + Operation::AddBack(168), + Operation::AddBack(289), + Operation::AddBack(44), + Operation::AddBack(168), + Operation::PopSmallest(44), + Operation::AddBack(778), + Operation::PopSmallest(168), + Operation::AddBack(971), + Operation::AddBack(883), + Operation::PopSmallest(289), + Operation::PopSmallest(312), + Operation::AddBack(901), + Operation::AddBack(886), + Operation::AddBack(931), + Operation::AddBack(529), + Operation::AddBack(71), + Operation::AddBack(186), + Operation::PopSmallest(71), + Operation::AddBack(805), + Operation::AddBack(919), + Operation::AddBack(670), + ]; + + pub fn run() { + let test_cases = [ + &[ + Operation::AddBack(2), + Operation::PopSmallest(1), + Operation::PopSmallest(2), + Operation::PopSmallest(3), + Operation::AddBack(1), + Operation::PopSmallest(1), + Operation::PopSmallest(4), + Operation::PopSmallest(5), + ] as &[_], + &[ + Operation::PopSmallest(1), + Operation::PopSmallest(2), + Operation::AddBack(1), + Operation::AddBack(2), + Operation::AddBack(1), + Operation::PopSmallest(1), + Operation::PopSmallest(2), + Operation::PopSmallest(3), + ], + &[ + Operation::PopSmallest(1), + Operation::PopSmallest(2), + Operation::PopSmallest(3), + Operation::PopSmallest(4), + Operation::PopSmallest(5), + Operation::AddBack(1), + Operation::AddBack(2), + Operation::AddBack(3), + Operation::AddBack(4), + Operation::AddBack(5), + Operation::PopSmallest(1), + ], + EXTRA_TEST_CASE_1, + ]; + + for operations in test_cases { + let mut smallest_infinite_set = S::new(); + + for operation in operations { + match *operation { + Operation::PopSmallest(expected) => assert_eq!(smallest_infinite_set.pop_smallest(), expected), + Operation::AddBack(num) => smallest_infinite_set.add_back(num), + } + } + } + } +}