Skip to content

Commit db78bd6

Browse files
committed
segtree: FromIterator
1 parent f89453f commit db78bd6

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

src/segtree.rs

+21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::internal_bit::ceil_pow2;
22
use crate::internal_type_traits::{BoundedAbove, BoundedBelow, One, Zero};
33
use std::cmp::{max, min};
44
use std::convert::Infallible;
5+
use std::iter::FromIterator;
56
use std::marker::PhantomData;
67
use std::ops::{Add, BitAnd, BitOr, BitXor, Mul, Not};
78

@@ -134,6 +135,26 @@ impl<M: Monoid> From<Vec<M::S>> for Segtree<M> {
134135
ret
135136
}
136137
}
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+
}
137158
impl<M: Monoid> Segtree<M> {
138159
pub fn set(&mut self, mut p: usize, x: M::S) {
139160
assert!(p < self.n);

0 commit comments

Comments
 (0)