pub struct DisjointSparseTable<S>where
S: SemiGroup,{
table: Vec<S::T>,
offsets: Vec<usize>,
len: usize,
}Fields§
§table: Vec<S::T>§offsets: Vec<usize>§len: usizeImplementations§
Source§impl<S> DisjointSparseTable<S>where
S: SemiGroup,
impl<S> DisjointSparseTable<S>where
S: SemiGroup,
Sourcepub fn new(v: Vec<S::T>) -> Self
pub fn new(v: Vec<S::T>) -> Self
Examples found in repository?
More examples
crates/competitive/src/data_structure/static_range_product.rs (line 167)
160 fn new(data: Vec<S::T>, level: usize) -> Self {
161 let n = data.len();
162 if n <= DIRECT_SIZE || level == 0 {
163 return Self::Direct { data };
164 }
165 if level == 1 {
166 return Self::Disjoint {
167 table: DisjointSparseTable::new(data),
168 };
169 }
170 let block_shift = scaled_block_shift(alpha_k(level - 1, n));
171 let block_size = 1usize << block_shift;
172 if block_size <= 1 || block_size >= n {
173 return Self::Direct { data };
174 }
175 let blocks = block_products::<S>(&data, block_size);
176 let between = Box::new(Self::new(blocks.products, level - 1));
177 Self::Recursive {
178 data,
179 block_shift,
180 prefix: blocks.prefix,
181 suffix: blocks.suffix,
182 between,
183 }
184 }Sourcepub fn fold_close(&self, l: usize, r: usize) -> S::T
pub fn fold_close(&self, l: usize, r: usize) -> S::T
Sourcepub fn fold(&self, l: usize, r: usize) -> S::T
pub fn fold(&self, l: usize, r: usize) -> S::T
Examples found in repository?
More examples
crates/competitive/src/data_structure/static_range_product.rs (line 190)
187 fn fold(&self, l: usize, r: usize) -> S::T {
188 match self {
189 Self::Direct { data } => fold_slice::<S>(data, l, r),
190 Self::Disjoint { table } => table.fold(l, r),
191 Self::Recursive {
192 data,
193 block_shift,
194 prefix,
195 suffix,
196 between,
197 } => {
198 let block_shift = *block_shift;
199 let bl = l >> block_shift;
200 let br = (r - 1) >> block_shift;
201 if bl == br {
202 return fold_slice::<S>(data, l, r);
203 }
204 let mut res = suffix[l].clone();
205 if bl + 1 < br {
206 let mid = between.fold(bl + 1, br);
207 res = S::operate(&res, &mid);
208 }
209 S::operate(&res, &prefix[r - 1])
210 }
211 }
212 }Trait Implementations§
Source§impl<S> Clone for DisjointSparseTable<S>where
S: SemiGroup,
impl<S> Clone for DisjointSparseTable<S>where
S: SemiGroup,
Source§impl<S> Debug for DisjointSparseTable<S>
impl<S> Debug for DisjointSparseTable<S>
Auto Trait Implementations§
impl<S> Freeze for DisjointSparseTable<S>
impl<S> RefUnwindSafe for DisjointSparseTable<S>
impl<S> Send for DisjointSparseTable<S>
impl<S> Sync for DisjointSparseTable<S>
impl<S> Unpin for DisjointSparseTable<S>
impl<S> UnsafeUnpin for DisjointSparseTable<S>
impl<S> UnwindSafe for DisjointSparseTable<S>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more