@@ -137,22 +137,8 @@ impl<M: Monoid> From<Vec<M::S>> for Segtree<M> {
137137}
138138impl < M : Monoid > FromIterator < M :: S > for Segtree < M > {
139139 fn from_iter < T : IntoIterator < Item = M :: S > > ( iter : T ) -> Self {
140- let iter = iter. into_iter ( ) ;
141- let n = iter. size_hint ( ) . 0 ;
142- let log = ceil_pow2 ( n as u32 ) as usize ;
143- let size = 1 << log;
144- let mut d = Vec :: with_capacity ( size * 2 ) ;
145- d. extend (
146- std:: iter:: repeat_with ( M :: identity)
147- . take ( size)
148- . chain ( iter)
149- . chain ( std:: iter:: repeat_with ( M :: identity) . take ( size - n) ) ,
150- ) ;
151- let mut ret = Segtree { n, size, log, d } ;
152- for i in ( 1 ..size) . rev ( ) {
153- ret. update ( i) ;
154- }
155- ret
140+ let v = iter. into_iter ( ) . collect :: < Vec < _ > > ( ) ;
141+ v. into ( )
156142 }
157143}
158144impl < M : Monoid > Segtree < M > {
@@ -353,6 +339,18 @@ mod tests {
353339 check_segtree ( & internal, & segtree) ;
354340 }
355341
342+ #[ test]
343+ fn test_segtree_fromiter ( ) {
344+ let v = [ 1 , 4 , 1 , 4 , 2 , 1 , 3 , 5 , 6 ] ;
345+ let base = v
346+ . iter ( )
347+ . copied ( )
348+ . filter ( |& x| x % 2 == 0 )
349+ . collect :: < Vec < _ > > ( ) ;
350+ let segtree: Segtree < Max < _ > > = v. iter ( ) . copied ( ) . filter ( |& x| x % 2 == 0 ) . collect ( ) ;
351+ check_segtree ( & base, & segtree) ;
352+ }
353+
356354 //noinspection DuplicatedCode
357355 fn check_segtree ( base : & [ i32 ] , segtree : & Segtree < Max < i32 > > ) {
358356 let n = base. len ( ) ;
0 commit comments