pub struct DaryPrefixSumTreeU64 {
levels: Vec<Vec<PrefixBlock<u64, 8>>>,
len: usize,
total: u64,
partition_valid: bool,
backend: SimdBackend,
}Expand description
A cache-line-oriented d-ary tree for point updates, prefix sums, and prefix searches.
BinaryIndexedTree has a denser layout and can be preferable for small workloads.
Use this type for repeated updates and prefix searches, especially with SIMD support.
Fields§
§levels: Vec<Vec<PrefixBlock<u64, 8>>>§len: usize§total: u64§partition_valid: bool§backend: SimdBackendImplementations§
Source§impl DaryPrefixSumTreeU64
impl DaryPrefixSumTreeU64
pub fn new(len: usize) -> Self
Sourcepub fn from_slice(values: &[u64]) -> Self
pub fn from_slice(values: &[u64]) -> Self
Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 24)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18 prepare_io!(reader, writer);
19 sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20 let tree = XorLinkedRootedTree::builder(n)
21 .with_dfs_preorder()
22 .build_from_ordered_parents(p);
23 let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24 let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25 for _ in 0..q {
26 sc!(query: Query);
27 match query {
28 Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29 Query::Sum { u } => {
30 let range = tree.subtree_range(u);
31 pp!(seg.fold(range.start, range.end));
32 }
33 }
34 }
35}pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
Sourcepub fn update(&mut self, index: usize, value: u64)
pub fn update(&mut self, index: usize, value: u64)
Adds value at index. Arithmetic is wrapping.
Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 28)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18 prepare_io!(reader, writer);
19 sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20 let tree = XorLinkedRootedTree::builder(n)
21 .with_dfs_preorder()
22 .build_from_ordered_parents(p);
23 let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24 let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25 for _ in 0..q {
26 sc!(query: Query);
27 match query {
28 Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29 Query::Sum { u } => {
30 let range = tree.subtree_range(u);
31 pp!(seg.fold(range.start, range.end));
32 }
33 }
34 }
35}Sourcepub fn set(&mut self, index: usize, value: u64)
pub fn set(&mut self, index: usize, value: u64)
Replaces the value at index. Arithmetic is wrapping.
Sourcepub fn accumulate0(&self, end: usize) -> u64
pub fn accumulate0(&self, end: usize) -> u64
Returns the wrapping sum of 0..end.
Sourcepub fn accumulate(&self, index: usize) -> u64
pub fn accumulate(&self, index: usize) -> u64
Returns the wrapping sum of 0..=index.
Sourcepub fn fold(&self, left: usize, right: usize) -> u64
pub fn fold(&self, left: usize, right: usize) -> u64
Returns the wrapping sum of left..right.
Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 31)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18 prepare_io!(reader, writer);
19 sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20 let tree = XorLinkedRootedTree::builder(n)
21 .with_dfs_preorder()
22 .build_from_ordered_parents(p);
23 let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24 let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25 for _ in 0..q {
26 sc!(query: Query);
27 match query {
28 Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29 Query::Sum { u } => {
30 let range = tree.subtree_range(u);
31 pp!(seg.fold(range.start, range.end));
32 }
33 }
34 }
35}pub fn get(&self, index: usize) -> u64
pub fn fold_all(&self) -> u64
Sourcepub fn partition_point_acc(&self, value: u64) -> usize
pub fn partition_point_acc(&self, value: u64) -> usize
Returns the number of leading values whose inclusive prefix sum is at most value.
§Panics
Panics if a prefix sum has overflowed.
fn zeroed(len: usize, backend: SimdBackend) -> Self
fn build(values: &[u64], backend: SimdBackend) -> Self
fn add(&mut self, index: usize, value: u64)
fn add_scalar(&mut self, index: usize, value: u64)
unsafe fn add_avx2(&mut self, index: usize, value: u64)
unsafe fn add_avx512(&mut self, index: usize, value: u64)
fn partition_point_by<F>(&self, value: u64, first_gt: F) -> usize
fn partition_point_scalar(&self, value: u64) -> usize
unsafe fn partition_point_avx2(&self, value: u64) -> usize
unsafe fn partition_point_avx512(&self, value: u64) -> usize
Trait Implementations§
Source§impl Clone for DaryPrefixSumTreeU64
impl Clone for DaryPrefixSumTreeU64
Auto Trait Implementations§
impl Freeze for DaryPrefixSumTreeU64
impl RefUnwindSafe for DaryPrefixSumTreeU64
impl Send for DaryPrefixSumTreeU64
impl Sync for DaryPrefixSumTreeU64
impl Unpin for DaryPrefixSumTreeU64
impl UnsafeUnpin for DaryPrefixSumTreeU64
impl UnwindSafe for DaryPrefixSumTreeU64
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