Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
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(\log n)\) 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
- intersects :: (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 + m \log n)\) 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
:: (PrimMonad m, Eq a, Unbox a) | |
=> Vector a | Input values |
-> (Int -> Int -> a -> m ()) |
|
-> m (IntervalMap (PrimState m) a) | The map |
\(O(n + m \log n)\) 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(\log n)\) Returns whether a point \(x\) is contained within any of the intervals.
Since: 1.1.0.0
intersects :: (PrimMonad m, Unbox a) => IntervalMap (PrimState m) a -> Int -> Int -> m Bool Source #
\(O(\log n)\) 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(\log n)\) 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(\log n)\) 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(\log n)\) 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(\log n)\) Inserts an interval \([l, r)\) with associated value \(v\) into the map. Overwrites any overlapping intervals.
Since: 1.1.0.0
:: (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(\log n)\) 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(\log n)\) Deletes an interval \([l, r)\) from the map.
Since: 1.1.0.0
:: (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(\log n)\) 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(\log n)\) Shorthand for overwriting the value of an interval that contains \([l, r)\).
Since: 1.1.0.0
:: (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(\log n)\). 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