Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
AtCoder.Extra.IntervalMap
Description
Dense map covering [0,n) that manages non-overlapping intervals [l,r) within it. Each
interval has an associated value v. Use onAdd
and onDel
hooks to track interval state
changes during buildM
, insertM
and deleteM
operations.
Invariant
Each interval is operated as a whole, similar to a persistant data structure. When part of an
inerval is modified, the whole interval is deleted first, and the subintervals are re-inserted.
It's important for tracking non-linear interval information with the onAdd
and onDel
hooks
(callbacks).
Example
Create an IntervalMap
that covers a half-open interval [0,n):
>>>
import AtCoder.Extra.IntervalMap qualified as ITM
>>>
import Data.Vector.Unboxed qualified as VU
>>>
import Data.Vector.Unboxed.Mutable qualified as VUM
>>>
itm <- ITM.new @_ @Int 4
It handles range set queries in amortized O(logn) time:
>>>
ITM.insert itm 0 4 0 -- 0 0 0 0
>>>
ITM.insert itm 1 3 1 -- 0 1 1 0
>>>
ITM.freeze itm
[(0,(1,0)),(1,(3,1)),(3,(4,0))]
Track interval informations with the onAdd
and onDel
hooks:
>>>
import Debug.Trace (traceShow)
>>>
itm <- ITM.new @_ @Int 4
>>>
let onAdd l r x = print ("onAdd", l, r, x)
>>>
let onDel l r x = print ("onDel", l, r, x)
>>>
ITM.insertM itm 0 4 0 onAdd onDel -- 0 0 0 0
("onAdd",0,4,0)
>>>
ITM.insertM itm 1 3 1 onAdd onDel -- 0 1 1 0
("onDel",0,4,0) ("onAdd",0,1,0) ("onAdd",3,4,0) ("onAdd",1,3,1)
>>>
ITM.deleteM itm 0 4 onAdd onDel
("onDel",0,1,0) ("onDel",1,3,1) ("onDel",3,4,0)
Since: 1.1.0.0
Synopsis
- data IntervalMap s a
- new :: (PrimMonad m, Unbox a) => Int -> m (IntervalMap (PrimState m) a)
- build :: (PrimMonad m, Eq a, Unbox a) => Vector a -> m (IntervalMap (PrimState m) a)
- buildM :: (PrimMonad m, Eq a, Unbox a) => Vector a -> (Int -> Int -> a -> m ()) -> m (IntervalMap (PrimState m) a)
- capacity :: IntervalMap s a -> Int
- contains :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> m Bool
- containsInterval :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m Bool
- lookup :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m (Maybe (Int, Int, a))
- read :: (HasCallStack, PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m a
- readMaybe :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m (Maybe a)
- insert :: (PrimMonad m, Eq a, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> a -> m ()
- insertM :: (PrimMonad m, Eq a, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> a -> (Int -> Int -> a -> m ()) -> (Int -> Int -> a -> m ()) -> m ()
- delete :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m ()
- deleteM :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> (Int -> Int -> a -> m ()) -> (Int -> Int -> a -> m ()) -> m ()
- overwrite :: (PrimMonad m, Eq a, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> a -> m ()
- overwriteM :: (PrimMonad m, Eq a, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> a -> (Int -> Int -> a -> m ()) -> (Int -> Int -> a -> m ()) -> m ()
- freeze :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> m (Vector (Int, (Int, a)))
IntervalMap
data IntervalMap s a Source #
Constructors
new :: (PrimMonad m, Unbox a) => Int -> m (IntervalMap (PrimState m) a) Source #
O(n) Creates an empty IntervalMap
.
Since: 1.1.0.0
build :: (PrimMonad m, Eq a, Unbox a) => Vector a -> m (IntervalMap (PrimState m) a) Source #
O(n+mlogn) Creates an IntervalMap
by combining consecutive equal values into one
interval.
Example
>>>
itm <- build @_ @Int (VU.fromList [10,10,11,11,12,12])
>>>
freeze itm
[(0,(2,10)),(2,(4,11)),(4,(6,12))]
Since: 1.1.0.0
Arguments
:: (PrimMonad m, Eq a, Unbox a) | |
=> Vector a | Input values |
-> (Int -> Int -> a -> m ()) |
|
-> m (IntervalMap (PrimState m) a) | The map |
O(n+mlogn) Creates an IntervalMap
by combining consecutive equal values into one
interval, while performing onAdd
hook for each interval.
Since: 1.1.0.0
Metadata
capacity :: IntervalMap s a -> Int Source #
O(1) Returns the capacity n, where the interval [0,n) is managed by the map.
Since: 1.1.0.0
Lookups
contains :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> m Bool Source #
O(logn) Returns whether a point x is contained within any of the intervals.
Since: 1.1.0.0
containsInterval :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m Bool Source #
O(logn) Returns whether an interval [l,r) is fully contained within any of the intervals.
Since: 1.1.0.0
lookup :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m (Maybe (Int, Int, a)) Source #
O(logn) Looks up an interval that fully contains [l,r).
Since: 1.1.0.0
read :: (HasCallStack, PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m a Source #
O(logn) Looks up an interval that fully contains [l,r) and reads out the value. Throws an error if no such interval exists.
Since: 1.1.0.0
readMaybe :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m (Maybe a) Source #
O(logn) Looks up an interval that fully contains [l,r) and reads out the value.
Returns Nothing
if no such interval exists.
Since: 1.1.0.0
Modifications
Insertions
insert :: (PrimMonad m, Eq a, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> a -> m () Source #
Amortized O(logn) Inserts an interval [l,r) with associated value v into the map. Overwrites any overlapping intervals.
Since: 1.1.0.0
Arguments
:: (PrimMonad m, Eq a, Unbox a) | |
=> IntervalMap (PrimState m) a | The map |
-> Int | l |
-> Int | r |
-> a | v |
-> (Int -> Int -> a -> m ()) |
|
-> (Int -> Int -> a -> m ()) |
|
-> m () |
Amortized O(logn) Inserts an interval [l,r) with associated value v into the
map. Overwrites any overlapping intervals. Tracks interval state changes via onAdd
and onDel
hooks.
Since: 1.1.0.0
Deletions
delete :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m () Source #
Amortized O(logn) Deletes an interval [l,r) from the map.
Since: 1.1.0.0
Arguments
:: (PrimMonad m, Unbox a) | |
=> IntervalMap (PrimState m) a | The map |
-> Int | l |
-> Int | r |
-> (Int -> Int -> a -> m ()) |
|
-> (Int -> Int -> a -> m ()) |
|
-> m () |
Amortized O(logn) Deletes an interval [l,r) from the map. Tracks interval state
changes via onAdd
and onDel
hooks.
Since: 1.1.0.0
Overwrites
overwrite :: (PrimMonad m, Eq a, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> a -> m () Source #
O(logn) Shorthand for overwriting the value of an interval that contains [l,r).
Since: 1.1.0.0
Arguments
:: (PrimMonad m, Eq a, Unbox a) | |
=> IntervalMap (PrimState m) a | The map |
-> Int | l |
-> Int | r |
-> a | v |
-> (Int -> Int -> a -> m ()) |
|
-> (Int -> Int -> a -> m ()) |
|
-> m () |
O(logn). Shorthand for overwriting the value of an interval that contains [l,r).
Tracks interval state changes via onAdd
and onDel
hooks.
Since: 1.1.0.0