Grove

A segment tree library enabling generic user-defined queries and actions on segments of your data, paired with different kinds of balanced binary trees (splay trees, avl trees, and so on).

In Grove, a segment tree is a data structure containing a sequence of values, that can answer queries about contiguous segments of values, and/or apply actions to all values in a contiguous segment, in efficient logarithmic time.

For example, a standard segment tree of integers might be able to compute the sum of values in a segment, the maximum value of a segment, and add a constant to all values in a segment, all in logarithmic time.

In order to specify what queries and actions can be made, the user needs to specify a marker type that implements the [Data] trait, defined in the [data] module. The [Data] trait has three associated types: * [Data]::Value is the type of values represented in the tree * [Data]::Summary is the result when querying the tree about a specific segment * [Data]::Action is the type of actions you can perform on segments of the tree these types have to implement the trait and conform its restrictions, in order for the tree to behave correctly. See its documentation.

Overall, you can perform these operations on a segment tree in logarithmic time: * Insert, delete and modify specific values * Compute a summary value of type Data::Summary of a segment * Apply an action of type Data::Action on every element of a segment * Choose what segment to query/apply action on, or search for a specific element, using binary search. See [locators] module. * Reverse segments of trees, split and concatenate segment trees

In order to use a certain kind of tree, i.e., red-black, AVL, splay tree, treaps, scapegoat trees, regular unbalanced trees, or any other, the user has to specify a tree type that implements the trait in the [trees] module. (currently splay/AVL/treaps/unbalanced trees are implemented)

Indeed, the library is generic in both the tree type and the [Data] instance: you can use any setting with any tree type.

The [methods] module provides some general methods for use on all trees.

Advanced examples

In the examples folder in the library (which is automatically stripped from crates.io), there are two examples showing usage of the library in two data structure/algorithmic questions. One is [yarra gnisrever], question #680 in [project euler]. The other is [pyramid base], a question from IOI 2008.

Both questions show how it's possible to define your own instance of [Data] for your specific usecase. They also show how you can write code that's generic with regards to the tree type: Both use the same code to run with treaps, splay trees and avl trees.

Notes: In order to run pyramidbase, you will need to download the pyramid base test files from [here], and save them in a new folder named "pyramidbasetestfiles". See also in the example code.