|
Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
|
Fenwick tree supporting range updates and range queries. More...
#include <tpl_fenwick_tree.H>
Public Types | |
| using | Item_Type = T |
Public Member Functions | |
| Range_Fenwick_Tree (const size_t num) | |
Construct a tree with num elements, all zero. | |
| Range_Fenwick_Tree (std::initializer_list< T > il) | |
| Construct from an initializer list in O(n) time. | |
| Range_Fenwick_Tree (const Array< T > &values) | |
| Construct from an Array<T> in O(n) time. | |
| Range_Fenwick_Tree (const Range_Fenwick_Tree &)=default | |
| Range_Fenwick_Tree (Range_Fenwick_Tree &&) noexcept=default | |
| Range_Fenwick_Tree & | operator= (const Range_Fenwick_Tree &)=default |
| Range_Fenwick_Tree & | operator= (Range_Fenwick_Tree &&) noexcept=default |
| void | update (size_t l, const size_t r, const T &delta) |
Range update: add delta to every a[i] with l <= i <= r. | |
| void | point_update (const size_t i, const T &delta) |
Point update: add delta to a[i]. | |
| T | prefix (const size_t i) const |
Prefix query: sum of a[0..i]. | |
| T | query (const size_t l, const size_t r) const |
Range query: sum of a[l..r]. | |
| T | get (const size_t i) const |
Retrieve the logical value a[i]. | |
| void | set (const size_t i, const T &value) |
Set a[i] = value. | |
| constexpr size_t | size () const noexcept |
| Number of logical elements. | |
| constexpr bool | is_empty () const noexcept |
| True if the tree contains no elements. | |
| Array< T > | values () const |
| Reconstruct all original values into an Array. | |
| void | swap (Range_Fenwick_Tree &other) noexcept |
Swap this tree with other in O(1). | |
Private Member Functions | |
| T | prefix_sum (size_t i) const |
| Internal: prefix sum P(i) = (i+1)*B1.prefix(i) - B2.prefix(i) | |
| void | build_from_diffs (const Array< T > &d) |
Rebuild b1 and b2 from a difference array stored in d. | |
Private Attributes | |
| Gen_Fenwick_Tree< T > | b1 |
| Gen_Fenwick_Tree< T > | b2 |
| size_t | n = 0 |
Fenwick tree supporting range updates and range queries.
Maintains an implicit array a[0..n-1] and supports adding a constant to every element in a contiguous range, as well as querying the sum over any contiguous range, both in O(log n).
Internally, two classic Fenwick trees (B1, B2) are kept so that the prefix sum can be recovered as
\[ P(i) = (i+1)\,\text{B1.prefix}(i) - \text{B2.prefix}(i) \]
This class is restricted to signed arithmetic types (it uses multiplication, subtraction, and negative deltas directly).
| T | signed arithmetic element type. |
| Operation | Time |
|---|---|
| Construction | O(n) |
| update (range) | O(log n) |
| prefix | O(log n) |
| query | O(log n) |
| get / set | O(log n) |
| Space | O(n) |
Definition at line 497 of file tpl_fenwick_tree.H.
| using Aleph::Range_Fenwick_Tree< T >::Item_Type = T |
Definition at line 524 of file tpl_fenwick_tree.H.
|
inline |
Construct a tree with num elements, all zero.
Definition at line 527 of file tpl_fenwick_tree.H.
|
inline |
Construct from an initializer list in O(n) time.
Definition at line 541 of file tpl_fenwick_tree.H.
References StlAlephIterator< SetName >::begin(), Aleph::Range_Fenwick_Tree< T >::build_from_diffs(), Aleph::Array< T >::create(), Aleph::maps(), and Aleph::Range_Fenwick_Tree< T >::n.
|
inline |
Construct from an Array<T> in O(n) time.
| values | source array with the initial element values. |
Definition at line 563 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::build_from_diffs(), Aleph::Array< T >::create(), Aleph::Range_Fenwick_Tree< T >::n, and Aleph::Range_Fenwick_Tree< T >::values().
|
default |
|
defaultnoexcept |
|
inlineprivate |
Rebuild b1 and b2 from a difference array stored in d.
Definition at line 510 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::b1, Aleph::Range_Fenwick_Tree< T >::b2, Aleph::Array< T >::create(), Aleph::maps(), and Aleph::Range_Fenwick_Tree< T >::n.
Referenced by Aleph::Range_Fenwick_Tree< T >::Range_Fenwick_Tree(), and Aleph::Range_Fenwick_Tree< T >::Range_Fenwick_Tree().
|
inline |
Retrieve the logical value a[i].
Equivalent to query(i, i). O(log n).
Definition at line 654 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::query().
Referenced by Aleph::Range_Fenwick_Tree< T >::set(), TEST(), and Aleph::Range_Fenwick_Tree< T >::values().
|
inlineconstexprnoexcept |
True if the tree contains no elements.
Definition at line 672 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::n.
|
default |
|
defaultnoexcept |
|
inline |
Point update: add delta to a[i].
Convenience shorthand for update(i, i, delta).
Definition at line 614 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::update().
Referenced by Aleph::Range_Fenwick_Tree< T >::set().
|
inline |
Prefix query: sum of a[0..i].
| i | 0-based index. |
| std::out_of_range | if i >= size(). |
Definition at line 625 of file tpl_fenwick_tree.H.
References ah_out_of_range_error_if, Aleph::Range_Fenwick_Tree< T >::n, and Aleph::Range_Fenwick_Tree< T >::prefix_sum().
Referenced by TEST().
|
inlineprivate |
Internal: prefix sum P(i) = (i+1)*B1.prefix(i) - B2.prefix(i)
Definition at line 504 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::b1, and Aleph::Range_Fenwick_Tree< T >::b2.
Referenced by Aleph::Range_Fenwick_Tree< T >::prefix(), and Aleph::Range_Fenwick_Tree< T >::query().
|
inline |
Range query: sum of a[l..r].
| l | 0-based left index (inclusive). |
| r | 0-based right index (inclusive). |
[l, r]. | std::out_of_range | if l > r or r >= size(). |
Definition at line 640 of file tpl_fenwick_tree.H.
References ah_out_of_range_error_if, l, Aleph::Range_Fenwick_Tree< T >::n, and Aleph::Range_Fenwick_Tree< T >::prefix_sum().
Referenced by Aleph::Range_Fenwick_Tree< T >::get(), and TEST().
|
inline |
Set a[i] = value.
Computes the required delta and calls point_update(). O(log n).
Definition at line 663 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::get(), and Aleph::Range_Fenwick_Tree< T >::point_update().
|
inlineconstexprnoexcept |
Number of logical elements.
Definition at line 669 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::n.
Referenced by TEST().
|
inlinenoexcept |
Swap this tree with other in O(1).
Definition at line 687 of file tpl_fenwick_tree.H.
References Aleph::Range_Fenwick_Tree< T >::b1, Aleph::Range_Fenwick_Tree< T >::b2, Aleph::maps(), and Aleph::Range_Fenwick_Tree< T >::n.
Referenced by TEST().
|
inline |
Range update: add delta to every a[i] with l <= i <= r.
| l | 0-based left index (inclusive). |
| r | 0-based right index (inclusive). |
| delta | value to add to each element in [l, r]. |
| std::out_of_range | if l > r or r >= size(). |
Definition at line 592 of file tpl_fenwick_tree.H.
References ah_out_of_range_error_if, Aleph::Range_Fenwick_Tree< T >::b1, Aleph::Range_Fenwick_Tree< T >::b2, l, Aleph::maps(), and Aleph::Range_Fenwick_Tree< T >::n.
Referenced by Aleph::Range_Fenwick_Tree< T >::point_update().
|
inline |
Reconstruct all original values into an Array.
O(n log n).
Definition at line 678 of file tpl_fenwick_tree.H.
References Aleph::Array< T >::create(), Aleph::Range_Fenwick_Tree< T >::get(), Aleph::maps(), and Aleph::Range_Fenwick_Tree< T >::n.
Referenced by Aleph::Range_Fenwick_Tree< T >::Range_Fenwick_Tree().
|
private |
Definition at line 499 of file tpl_fenwick_tree.H.
Referenced by Aleph::Range_Fenwick_Tree< T >::build_from_diffs(), Aleph::Range_Fenwick_Tree< T >::prefix_sum(), Aleph::Range_Fenwick_Tree< T >::swap(), and Aleph::Range_Fenwick_Tree< T >::update().
|
private |
Definition at line 500 of file tpl_fenwick_tree.H.
Referenced by Aleph::Range_Fenwick_Tree< T >::build_from_diffs(), Aleph::Range_Fenwick_Tree< T >::prefix_sum(), Aleph::Range_Fenwick_Tree< T >::swap(), and Aleph::Range_Fenwick_Tree< T >::update().
|
private |
Definition at line 501 of file tpl_fenwick_tree.H.
Referenced by Aleph::Range_Fenwick_Tree< T >::Range_Fenwick_Tree(), Aleph::Range_Fenwick_Tree< T >::Range_Fenwick_Tree(), Aleph::Range_Fenwick_Tree< T >::build_from_diffs(), Aleph::Range_Fenwick_Tree< T >::is_empty(), Aleph::Range_Fenwick_Tree< T >::prefix(), Aleph::Range_Fenwick_Tree< T >::query(), Aleph::Range_Fenwick_Tree< T >::size(), Aleph::Range_Fenwick_Tree< T >::swap(), Aleph::Range_Fenwick_Tree< T >::update(), and Aleph::Range_Fenwick_Tree< T >::values().