@@ -137,22 +137,8 @@ impl<M: Monoid> From<Vec<M::S>> for Segtree<M> {
137
137
}
138
138
impl < M : Monoid > FromIterator < M :: S > for Segtree < M > {
139
139
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 ( )
156
142
}
157
143
}
158
144
impl < M : Monoid > Segtree < M > {
@@ -353,6 +339,18 @@ mod tests {
353
339
check_segtree ( & internal, & segtree) ;
354
340
}
355
341
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
+
356
354
//noinspection DuplicatedCode
357
355
fn check_segtree ( base : & [ i32 ] , segtree : & Segtree < Max < i32 > > ) {
358
356
let n = base. len ( ) ;
0 commit comments