@@ -2,6 +2,7 @@ use crate::internal_bit::ceil_pow2;
2
2
use crate :: internal_type_traits:: { BoundedAbove , BoundedBelow , One , Zero } ;
3
3
use std:: cmp:: { max, min} ;
4
4
use std:: convert:: Infallible ;
5
+ use std:: iter:: FromIterator ;
5
6
use std:: marker:: PhantomData ;
6
7
use std:: ops:: { Add , BitAnd , BitOr , BitXor , Mul , Not } ;
7
8
@@ -134,6 +135,26 @@ impl<M: Monoid> From<Vec<M::S>> for Segtree<M> {
134
135
ret
135
136
}
136
137
}
138
+ impl < M : Monoid > FromIterator < M :: S > for Segtree < M > {
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
156
+ }
157
+ }
137
158
impl < M : Monoid > Segtree < M > {
138
159
pub fn set ( & mut self , mut p : usize , x : M :: S ) {
139
160
assert ! ( p < self . n) ;
0 commit comments