From 05e2c0009e46be16ad4cfd10cd1dac0393f44b38 Mon Sep 17 00:00:00 2001 From: mousecrusher2 <95418154+mousecrusher2@users.noreply.github.com> Date: Tue, 13 Feb 2024 22:19:43 +0900 Subject: [PATCH 1/2] fix FromIterator for Segtree --- src/segtree.rs | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/segtree.rs b/src/segtree.rs index e79c74e..1b7113c 100644 --- a/src/segtree.rs +++ b/src/segtree.rs @@ -137,22 +137,8 @@ impl From> for Segtree { } impl FromIterator for Segtree { fn from_iter>(iter: T) -> Self { - let iter = iter.into_iter(); - let n = iter.size_hint().0; - let log = ceil_pow2(n as u32) as usize; - let size = 1 << log; - let mut d = Vec::with_capacity(size * 2); - d.extend( - std::iter::repeat_with(M::identity) - .take(size) - .chain(iter) - .chain(std::iter::repeat_with(M::identity).take(size - n)), - ); - let mut ret = Segtree { n, size, log, d }; - for i in (1..size).rev() { - ret.update(i); - } - ret + let v = iter.into_iter().collect::>(); + v.into() } } impl Segtree { @@ -353,6 +339,18 @@ mod tests { check_segtree(&internal, &segtree); } + #[test] + fn test_segtree_fromiter() { + let v = vec![1, 4, 1, 4, 2, 1, 3, 5, 6]; + let base = v + .iter() + .copied() + .filter(|&x| x % 2 == 0) + .collect::>(); + let segtree: Segtree> = v.iter().copied().filter(|&x| x % 2 == 0).collect(); + check_segtree(&base, &segtree); + } + //noinspection DuplicatedCode fn check_segtree(base: &[i32], segtree: &Segtree>) { let n = base.len(); From 23ccb58a273cc27688ae55f91ab3d5eb731903b1 Mon Sep 17 00:00:00 2001 From: mousecrusher2 <95418154+mousecrusher2@users.noreply.github.com> Date: Thu, 15 Feb 2024 04:02:13 +0900 Subject: [PATCH 2/2] remove unnecessary vec! --- src/segtree.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/segtree.rs b/src/segtree.rs index 1b7113c..0b76b40 100644 --- a/src/segtree.rs +++ b/src/segtree.rs @@ -341,7 +341,7 @@ mod tests { #[test] fn test_segtree_fromiter() { - let v = vec![1, 4, 1, 4, 2, 1, 3, 5, 6]; + let v = [1, 4, 1, 4, 2, 1, 3, 5, 6]; let base = v .iter() .copied()