SegmentTree
This library implements segment tree data structure
Segment tree allows effectively calculate sum of elements in sub arrays by storing some amount of additional data.
| Provided implementation assumes that arrays is indexed from 1 to n. Size of initial array always must be power of 2 |
Example:
Array: ------------------------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ------------------------+
Segment tree structure: ------------------------------- | 36 | ------------------------------+ | 10 | 26 | ----------------------------+ | 3 | 7 | 11 | 15 | ------------------------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ------------------------+
How the segment tree is stored in an array: -------------------------------------------------- | 36 | 10 | 26 | 3 | 7 | 11 | 15 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | --------------------------------------------------
create create(struct SegmentTree.Tree segmentTree, uint256 size) external
Allocates storage for segment tree of size elements
Requirements:
-
sizemust be greater than 0 -
sizemust be power of 2
addToPlace addToPlace(struct SegmentTree.Tree self, uint256 place, uint256 delta) external
Adds delta to element of segment tree at place
Requirements:
-
placemust be in range [1, size]
removeFromPlace removeFromPlace(struct SegmentTree.Tree self, uint256 place, uint256 delta) external
Subtracts delta from element of segment tree at place
Requirements:
-
placemust be in range [1, size] -
initial value of target element must be not less than
delta
moveFromPlaceToPlace moveFromPlaceToPlace(struct SegmentTree.Tree self, uint256 fromPlace, uint256 toPlace, uint256 delta) external
Adds delta to element of segment tree at toPlace
and subtracts delta from element at fromPlace
Requirements:
-
fromPlacemust be in range [1, size] -
toPlacemust be in range [1, size] -
initial value of element at
fromPlacemust be not less thandelta
getRandomNonZeroElementFromPlaceToLast getRandomNonZeroElementFromPlaceToLast(struct SegmentTree.Tree self, uint256 place, struct Random.RandomGenerator randomGenerator) → uint256 external
Returns random position in range [place, size]
with probability proportional to value stored at this position.
If all element in range are 0 returns 0
Requirements:
-
placemust be in range [1, size]
sumFromPlaceToLast sumFromPlaceToLast(struct SegmentTree.Tree self, uint256 place) → uint256 sum public
Returns sum of elements in range [place, size]
Requirements:
-
placemust be in range [1, size]
getSize getSize(struct SegmentTree.Tree segmentTree) → uint256 internal
Returns amount of elements in segment tree