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<M: Monoid> From<Vec<M::S>> for Segtree<M> {
 }
 impl<M: Monoid> FromIterator<M::S> for Segtree<M> {
     fn from_iter<T: IntoIterator<Item = M::S>>(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::<Vec<_>>();
+        v.into()
     }
 }
 impl<M: Monoid> Segtree<M> {
@@ -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::<Vec<_>>();
+        let segtree: Segtree<Max<_>> = v.iter().copied().filter(|&x| x % 2 == 0).collect();
+        check_segtree(&base, &segtree);
+    }
+
     //noinspection DuplicatedCode
     fn check_segtree(base: &[i32], segtree: &Segtree<Max<i32>>) {
         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()