-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Data structure for querying the set (or count) of intervals covering given point
--
-- Segment Tree implemented following section 10.3 and 10.4 of Mark de
-- Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars Computational
-- Geometry, Algorithms and Applications, Third Edition (2008) pp
-- 231-237
@package SegmentTree
@version 0.2
-- | Segment Tree implemented following section 10.3 and 10.4 of
--
--
--
-- Accumulation of results with monoids following Monoids and Finger
-- Trees,
-- http:apfelmus.nfshost.comarticlesmonoid-fingertree.html
--
-- An amortized running time is given for each operation, with n
-- referring to the number of intervals.
module Data.SegmentTree
-- | Segment Tree is a binary tree that stores Interval in each leaf or
-- branch. By construction (see leaf and branch) intervals
-- in branches should be union of the intervals from left and right
-- subtrees.
--
-- Additionally, each node carries a tag of type t (which
-- should be monoid). By supplying different monoids, segment tree could
-- be made to support different types of stabbing queries: Sum or Integer
-- monoid will give tree that counts hits, and list or Set monoids will
-- give a tree that returns actual intervals containing point.
data STree t a
Leaf :: !t -> !Interval a -> STree t a
Branch :: !t -> !Interval a -> !STree t a -> !STree t a -> STree t a
-- | Build the SegmentTree for the given list of pair of points.
-- Time: O(n*log n) Segment tree is built as follows: * Supplied list of
-- point pairs define so-called atomic intervals * They are used
-- to build skeleton binary tree * Each supplied interval is then
-- inserted into this tree, updating tag values in tree branches
-- and leaves
fromList :: (Monoid t, Measured (Interval a) t, Ord a) => [(a, a)] -> STree t a
-- | Insert interval i into segment tree, updating tag values as
-- necessary. Semantics of tags depends on the monoid used (see
-- fromList)
insert :: (Ord a, Measured (Interval a) t) => STree t a -> Interval a -> STree t a
-- | Query the segment tree for the specified point. Time: O(log n)
queryTree :: (Monoid t, Measured (Interval a) t, Ord a) => STree t a -> a -> t
-- | Convenience wrapper around queryTree. Returns count of
-- intervals covering the point
countingQuery :: (Measured (Interval a) (Sum b), Ord a) => STree (Sum b) a -> a -> b
-- | Convenience wrapper around queryTree to perform stabbing query.
-- Returns list of intevals coverting the point
stabbingQuery :: (Measured (Interval a) [Interval a], Ord a) => STree [Interval a] a -> a -> [Interval a]
instance (Num a, Num b) => Measured (Interval a) (Sum b)
instance Measured (Interval a) [Interval a]
instance (Show t, Show a) => Show (STree t a)