iota-0.1.0.0
Safe HaskellNone
LanguageGHC2021

Data.FenwickTree.Sum

Synopsis

Documentation

newtype SumFenwickTree s a Source #

Constructors

SumFenwickTree 

Fields

newSumFenwickTree :: (Unbox a, Num a, PrimMonad m) => Int -> m (SumFenwickTree (PrimState m) a) Source #

buildSumFenwickTree :: (Unbox a, Num a, PrimMonad m) => Vector a -> m (SumFenwickTree (PrimState m) a) Source #

O(n)

sumTo :: (PrimMonad m, Unbox a, Num a) => SumFenwickTree (PrimState m) a -> Int -> m a Source #

sum[0..k)

O(log n)

sumFromTo :: (PrimMonad m, Unbox a, Num a) => SumFenwickTree (PrimState m) a -> Int -> Int -> m a Source #

sum[l..r)

O(log n)

addAt :: (Unbox a, Num a, PrimMonad m) => SumFenwickTree (PrimState m) a -> Int -> a -> m () Source #

O(log n)

readSFT :: (Num a, Unbox a, PrimMonad m) => SumFenwickTree (PrimState m) a -> Int -> m a Source #

O(log n)

writeSFT :: (Num a, Unbox a, PrimMonad m) => SumFenwickTree (PrimState m) a -> Int -> a -> m () Source #

O(log n)

lowerBoundSFT :: (Unbox a, Num a, Ord a, PrimMonad m) => SumFenwickTree (PrimState m) a -> a -> m Int Source #

min i s.t. sum [0..i) >= w

>>> ft <- buildSumFenwickTree @Int (U.fromList [1,1,1,1,1])
>>> lowerBoundSFT ft 3
3
>>> sumTo ft 3
3
>>> lowerBoundSFT ft 0
0
>>> lowerBoundSFT ft 1
1
>>> lowerBoundSFT ft 10
6
>>> ft <- buildSumFenwickTree @Int (U.fromList [1,1,0,0,0])
>>> lowerBoundSFT ft 2
2

upperBoundSFT :: (Unbox a, Num a, Ord a, PrimMonad m) => SumFenwickTree (PrimState m) a -> a -> m Int Source #

max i s.t. sum [0..i) <= w

>>> ft <- buildSumFenwickTree @Int (U.fromList [1,1,1,1,1])
>>> upperBoundSFT ft 3
3
>>> sumTo ft 3
3
>>> upperBoundSFT ft 0
0
>>> upperBoundSFT ft 1
1
>>> upperBoundSFT ft 10
5
>>> ft <- buildSumFenwickTree @Int (U.fromList [1,1,0,0,1])
>>> upperBoundSFT ft 2
4