{-# LANGUAGE RecordWildCards #-}

-- | A Fenwick tree, also known as binary indexed tree. Given an array of length \(n\), it processes
-- the following queries in \(O(\log n)\) time.
--
-- - Updating an element
-- - Calculating the sum of the elements of an interval
--
-- ==== __Example__
-- Create a `FenwickTree` with `new`:
--
-- >>> import AtCoder.FenwickTree qualified as FT
-- >>> ft <- FT.new @_ @Int 4 -- [0, 0, 0, 0]
-- >>> FT.nFt ft
-- 4
--
-- It can perform point `add` and range `sum` in \(O(\log n)\) time:
--
-- >>> FT.add ft 0 3          -- [3, 0, 0, 0]
-- >>> FT.sum ft 0 3
-- 3
--
-- >>> FT.add ft 2 3          -- [3, 0, 3, 0]
-- >>> FT.sum ft 0 3
-- 6
--
-- Create a `FenwickTree` with initial values using `build`:
--
-- >>> ft <- FT.build @_ @Int $ VU.fromList [3, 0, 3, 0]
-- >>> FT.add ft 1 2          -- [3, 2, 3, 0]
-- >>> FT.sum ft 0 3
-- 8
--
-- @since 1.0.0.0
module AtCoder.FenwickTree
  ( -- * Fenwick tree
    FenwickTree (nFt),

    -- * Constructors
    new,
    build,

    -- * Adding
    add,

    -- * Accessors
    sum,
    sumMaybe,

    -- * Bisection methods
    maxRight,
    maxRightM,
    minLeft,
    minLeftM,
  )
where

import AtCoder.Internal.Assert qualified as ACIA
import Control.Monad (when)
import Control.Monad.Fix (fix)
import Control.Monad.Primitive (PrimMonad, PrimState, stToPrim)
import Control.Monad.ST (ST)
import Data.Bits
import Data.Vector.Generic.Mutable qualified as VGM
import Data.Vector.Unboxed qualified as VU
import Data.Vector.Unboxed.Mutable qualified as VUM
import GHC.Stack (HasCallStack)
import Prelude hiding (sum)

-- | A Fenwick tree.
--
-- @since 1.0.0.0
data FenwickTree s a = FenwickTree
  { -- | 1.0.0 The number of vertices.
    --
    -- @since 1.0.0.0
    forall s a. FenwickTree s a -> Int
nFt :: {-# UNPACK #-} !Int,
    -- | The data storage.
    forall s a. FenwickTree s a -> MVector s a
dataFt :: !(VUM.MVector s a)
  }

-- | Creates an array \([a_0, a_1, \cdots, a_{n-1}]\) of length \(n\). All the elements are
-- initialized to \(0\).
--
-- ==== Constraints
-- - \(0 \leq n\)
--
-- ==== Complexity
-- - \(O(n)\)
--
-- @since 1.0.0.0
{-# INLINE new #-}
new :: (HasCallStack, PrimMonad m, Num a, VU.Unbox a) => Int -> m (FenwickTree (PrimState m) a)
new :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
Int -> m (FenwickTree (PrimState m) a)
new = ST (PrimState m) (FenwickTree (PrimState m) a)
-> m (FenwickTree (PrimState m) a)
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) (FenwickTree (PrimState m) a)
 -> m (FenwickTree (PrimState m) a))
-> (Int -> ST (PrimState m) (FenwickTree (PrimState m) a))
-> Int
-> m (FenwickTree (PrimState m) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ST (PrimState m) (FenwickTree (PrimState m) a)
forall a s.
(HasCallStack, Num a, Unbox a) =>
Int -> ST s (FenwickTree s a)
newST

-- | Creates `FenwickTree` with initial values.
--
-- ==== Complexity
-- - \(O(n)\)
--
-- @since 1.0.0.0
{-# INLINE build #-}
build :: (PrimMonad m, Num a, VU.Unbox a) => VU.Vector a -> m (FenwickTree (PrimState m) a)
build :: forall (m :: * -> *) a.
(PrimMonad m, Num a, Unbox a) =>
Vector a -> m (FenwickTree (PrimState m) a)
build = ST (PrimState m) (FenwickTree (PrimState m) a)
-> m (FenwickTree (PrimState m) a)
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) (FenwickTree (PrimState m) a)
 -> m (FenwickTree (PrimState m) a))
-> (Vector a -> ST (PrimState m) (FenwickTree (PrimState m) a))
-> Vector a
-> m (FenwickTree (PrimState m) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> ST (PrimState m) (FenwickTree (PrimState m) a)
forall a s. (Num a, Unbox a) => Vector a -> ST s (FenwickTree s a)
buildST

-- | Adds \(x\) to \(p\)-th value of the array.
--
-- ==== Constraints
-- - \(0 \leq l \lt n\)
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.0.0.0
{-# INLINE add #-}
add :: (HasCallStack, PrimMonad m, Num a, VU.Unbox a) => FenwickTree (PrimState m) a -> Int -> a -> m ()
add :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> a -> m ()
add FenwickTree (PrimState m) a
ft Int
p0 a
x = ST (PrimState m) () -> m ()
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) () -> m ()) -> ST (PrimState m) () -> m ()
forall a b. (a -> b) -> a -> b
$ FenwickTree (PrimState m) a -> Int -> a -> ST (PrimState m) ()
forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> a -> ST s ()
addST FenwickTree (PrimState m) a
ft Int
p0 a
x

-- | Calculates the sum in a half-open interval \([l, r)\).
--
-- ==== Constraints
-- - \(0 \leq l \leq r \leq n\)
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.0.0.0
{-# INLINE sum #-}
sum :: (HasCallStack, PrimMonad m, Num a, VU.Unbox a) => FenwickTree (PrimState m) a -> Int -> Int -> m a
sum :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> Int -> m a
sum FenwickTree (PrimState m) a
ft Int
l Int
r = ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ FenwickTree (PrimState m) a -> Int -> Int -> ST (PrimState m) a
forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s a
sumST FenwickTree (PrimState m) a
ft Int
l Int
r

-- | Total variant of `sum`. Calculates the sum in a half-open interval \([l, r)\). It returns
-- `Nothing` if the interval is invalid.
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.0.0.0
{-# INLINE sumMaybe #-}
sumMaybe :: (HasCallStack, PrimMonad m, Num a, VU.Unbox a) => FenwickTree (PrimState m) a -> Int -> Int -> m (Maybe a)
sumMaybe :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> Int -> m (Maybe a)
sumMaybe FenwickTree (PrimState m) a
ft Int
l Int
r = ST (PrimState m) (Maybe a) -> m (Maybe a)
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) (Maybe a) -> m (Maybe a))
-> ST (PrimState m) (Maybe a) -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ FenwickTree (PrimState m) a
-> Int -> Int -> ST (PrimState m) (Maybe a)
forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s (Maybe a)
sumMaybeST FenwickTree (PrimState m) a
ft Int
l Int
r

-- | (Extra API) Applies a binary search on the Fenwick tree. It returns an index \(r\) that
-- satisfies both of the following.
--
-- - \(r = l\) or \(f(a[l] + a[l + 1] + ... + a[r - 1])\) returns `True`.
-- - \(r = n\) or \(f(a[l] + a[l + 1] + ... + a[r]))\) returns `False`.
--
-- If \(f\) is monotone, this is the maximum \(r\) that satisfies
-- \(f(a[l] + a[l + 1] + ... + a[r - 1])\).
--
-- ==== Constraints
-- - if \(f\) is called with the same argument, it returns the same value, i.e., \(f\) has no side effect.
-- - \(f(0)\) returns `True`
-- - \(0 \leq l \leq n\)
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.2.2.0
{-# INLINE maxRight #-}
maxRight ::
  (HasCallStack, PrimMonad m, Num a, VU.Unbox a) =>
  -- | The Fenwick tree
  FenwickTree (PrimState m) a ->
  -- | \(l\)
  Int ->
  -- | \(p\): user predicate
  (a -> Bool) ->
  -- | \(r\): \(p\) holds for \([l, r)\)
  m Int
maxRight :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> (a -> Bool) -> m Int
maxRight FenwickTree (PrimState m) a
ft Int
l0 a -> Bool
f = FenwickTree (PrimState m) a -> Int -> (a -> m Bool) -> m Int
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> (a -> m Bool) -> m Int
maxRightM FenwickTree (PrimState m) a
ft Int
l0 (Bool -> m Bool
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> m Bool) -> (a -> Bool) -> a -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
f)

-- | (Extra API) Monadic variant of `maxRight`.
--
-- ==== Constraints
-- - if \(f\) is called with the same argument, it returns the same value, i.e., \(f\) has no side effect.
-- - \(f(0)\) returns `True`
-- - \(0 \leq l \leq n\)
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.2.2.0
{-# INLINEABLE maxRightM #-}
maxRightM ::
  forall m a.
  (HasCallStack, PrimMonad m, Num a, VU.Unbox a) =>
  -- | The Fenwick tree
  FenwickTree (PrimState m) a ->
  -- | \(l\)
  Int ->
  -- | \(p\): user predicate
  (a -> m Bool) ->
  -- | \(r\): \(p\) holds for \([l, r)\)
  m Int
maxRightM :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> (a -> m Bool) -> m Int
maxRightM FenwickTree {Int
MVector (PrimState m) a
nFt :: forall s a. FenwickTree s a -> Int
dataFt :: forall s a. FenwickTree s a -> MVector s a
nFt :: Int
dataFt :: MVector (PrimState m) a
..} Int
l0 a -> m Bool
f = do
  Bool
b0 <- a -> m Bool
f a
0
  let !()
_ = HasCallStack => Bool -> String -> ()
Bool -> String -> ()
ACIA.runtimeAssert Bool
b0 String
"AtCoder.FenwickTree.maxRightM: `f 0` must return `True`"

  let inner :: Int -> a -> m (Int, Int, a)
inner Int
i !a
s
        | Int -> Bool
forall a. Integral a => a -> Bool
odd Int
i = do
            a
ds <- ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ MVector (PrimState (ST (PrimState m))) a
-> Int -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
dataFt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
            Int -> a -> m (Int, Int, a)
inner (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (a -> m (Int, Int, a)) -> a -> m (Int, Int, a)
forall a b. (a -> b) -> a -> b
$! a
s a -> a -> a
forall a. Num a => a -> a -> a
- a
ds
        | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = (Int, Int, a) -> m (Int, Int, a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
i, Int
64 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Int
forall b. FiniteBits b => b -> Int
countLeadingZeros Int
nFt, a
s)
        | Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
nFt = (Int, Int, a) -> m (Int, Int, a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
i, Int
k, a
s)
        | Bool
otherwise = do
            a
t <- ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ (a
s +) (a -> a) -> ST (PrimState m) a -> ST (PrimState m) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MVector (PrimState (ST (PrimState m))) a
-> Int -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
dataFt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
            Bool
b <- a -> m Bool
f a
t
            if Bool -> Bool
not Bool
b
              then (Int, Int, a) -> m (Int, Int, a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
i, Int
k, a
s)
              else do
                a
di <- ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ MVector (PrimState (ST (PrimState m))) a
-> Int -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
dataFt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
                Int -> a -> m (Int, Int, a)
inner (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (-Int
i)) (a -> m (Int, Int, a)) -> a -> m (Int, Int, a)
forall a b. (a -> b) -> a -> b
$! a
s a -> a -> a
forall a. Num a => a -> a -> a
- a
di
        where
          k :: Int
k = Int -> Int
forall b. FiniteBits b => b -> Int
countTrailingZeros Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1

  -- we could start from an arbitrary l, but the API is limited to one
  (!Int
i0, !Int
k0, !a
s0) <- Int -> a -> m (Int, Int, a)
inner Int
l0 (a
0 :: a)

  let inner2 :: Int -> Int -> a -> m Int
inner2 Int
i Int
k_ !a
s
        | Int
k_ Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Int -> m Int
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
i
        | Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< MVector (PrimState m) a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VGM.length MVector (PrimState m) a
dataFt = do
            a
t <- ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ (a
s +) (a -> a) -> ST (PrimState m) a -> ST (PrimState m) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MVector (PrimState (ST (PrimState m))) a
-> Int -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
dataFt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
            Bool
b <- a -> m Bool
f a
t
            if Bool
b
              then Int -> Int -> a -> m Int
inner2 (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k) Int
k a
t
              else Int -> Int -> a -> m Int
inner2 Int
i Int
k a
s
        | Bool
otherwise = Int -> Int -> a -> m Int
inner2 Int
i Int
k a
s
        where
          k :: Int
k = Int
k_ Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1

  Int -> Int -> a -> m Int
inner2 Int
i0 Int
k0 a
s0

-- | Applies a binary search on the Fenwick tree. It returns an index \(l\) that satisfies both of
-- the following.
--
-- - \(l = r\) or \(f(a[l] + a[l + 1] + ... + a[r - 1])\) returns `True`.
-- - \(l = 0\) or \(f(a[l - 1] + a[l] + ... + a[r - 1])\) returns `False`.
--
-- If \(f\) is monotone, this is the minimum \(l\) that satisfies
-- \(f(a[l] + a[l + 1] + ... + a[r - 1])\).
--
-- ==== Constraints
--
-- - if \(f\) is called with the same argument, it returns the same value, i.e., \(f\) has no side
--   effect.
-- - \(f(0)\) returns `True`
-- - \(0 \leq r \leq n\)
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.2.2.0
{-# INLINE minLeft #-}
minLeft ::
  (HasCallStack, PrimMonad m, Num a, VU.Unbox a) =>
  -- | The Fenwick tree
  FenwickTree (PrimState m) a ->
  -- | \(r\)
  Int ->
  -- | \(p\): user prediate
  (a -> Bool) ->
  -- | \(l\): \(p\) holds for \([l, r)\)
  m Int
minLeft :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> (a -> Bool) -> m Int
minLeft FenwickTree (PrimState m) a
ft Int
r0 a -> Bool
f = FenwickTree (PrimState m) a -> Int -> (a -> m Bool) -> m Int
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> (a -> m Bool) -> m Int
minLeftM FenwickTree (PrimState m) a
ft Int
r0 (Bool -> m Bool
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> m Bool) -> (a -> Bool) -> a -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
f)

-- | (Extra API) Monadic variant of `minLeft`.
--
-- ==== Constraints
-- - if \(f\) is called with the same argument, it returns the same value, i.e., \(f\) has no side effect.
-- - \(f(0)\) returns `True`
-- - \(0 \leq l \leq n\)
--
-- ==== Complexity
-- - \(O(\log n)\)
--
-- @since 1.2.2.0
{-# INLINEABLE minLeftM #-}
minLeftM ::
  forall m a.
  (HasCallStack, PrimMonad m, Num a, VU.Unbox a) =>
  -- | The Fenwick tree
  FenwickTree (PrimState m) a ->
  -- | \(r\)
  Int ->
  -- | \(p\): user prediate
  (a -> m Bool) ->
  -- | \(l\): \(p\) holds for \([l, r)\)
  m Int
minLeftM :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> (a -> m Bool) -> m Int
minLeftM FenwickTree {Int
MVector (PrimState m) a
nFt :: forall s a. FenwickTree s a -> Int
dataFt :: forall s a. FenwickTree s a -> MVector s a
nFt :: Int
dataFt :: MVector (PrimState m) a
..} Int
r0 a -> m Bool
f = do
  Bool
b0 <- a -> m Bool
f a
0
  let !()
_ = HasCallStack => Bool -> String -> ()
Bool -> String -> ()
ACIA.runtimeAssert Bool
b0 String
"AtCoder.FenwickTree.minLeftM: `f 0` must return `True`"

  let inner :: Int -> Int -> a -> m (Int, Int, a)
inner Int
i Int
k !a
s
        | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = (Int, Int, a) -> m (Int, Int, a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
i, Int
k, a
s)
        | Bool
otherwise = do
            Bool
b <- a -> m Bool
f a
s
            if Bool -> Bool
not Bool
b
              then (Int, Int, a) -> m (Int, Int, a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
i, Int
k, a
s)
              else do
                a
s' <- ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ (a
s +) (a -> a) -> ST (PrimState m) a -> ST (PrimState m) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MVector (PrimState (ST (PrimState m))) a
-> Int -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
dataFt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
                Int -> Int -> a -> m (Int, Int, a)
inner (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (-Int
i)) (Int -> Int
forall b. FiniteBits b => b -> Int
countTrailingZeros Int
i) a
s'

  -- we could start from an arbitrary r, but the API is limited to n
  (!Int
i0, !Int
k0, !a
s0) <- Int -> Int -> a -> m (Int, Int, a)
inner Int
r0 (Int
0 :: Int) (a
0 :: a)

  Bool
b0_ <- a -> m Bool
f a
s0
  if Bool
b0_
    then do
      let !()
_ = HasCallStack => Bool -> String -> ()
Bool -> String -> ()
ACIA.runtimeAssert (Int
i0 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) String
"AtCoder.FenwickTree.minLeftM: implementation error"
      Int -> m Int
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0
    else do
      let inner2 :: Int -> Int -> a -> m Int
inner2 Int
i Int
k_ !a
s
            | Int
k_ Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Int -> m Int
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
i
            | Bool
otherwise = do
                let k :: Int
k = Int
k_ Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
                a
t <- ST (PrimState m) a -> m a
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> m a
forall a b. (a -> b) -> a -> b
$ (a
s -) (a -> a) -> ST (PrimState m) a -> ST (PrimState m) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MVector (PrimState (ST (PrimState m))) a
-> Int -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
dataFt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
                Bool
b <- a -> m Bool
f a
t
                if Bool
b
                  then Int -> Int -> a -> m Int
inner2 Int
i Int
k a
s
                  else Int -> Int -> a -> m Int
inner2 (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Bits a => Int -> a
bit Int
k) Int
k a
t

      (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int -> Int) -> m Int -> m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Int -> a -> m Int
inner2 Int
i0 Int
k0 a
s0

-- -------------------------------------------------------------------------------------------------
-- Internal
-- -------------------------------------------------------------------------------------------------

{-# INLINEABLE newST #-}
newST :: (HasCallStack, Num a, VU.Unbox a) => Int -> ST s (FenwickTree s a)
newST :: forall a s.
(HasCallStack, Num a, Unbox a) =>
Int -> ST s (FenwickTree s a)
newST Int
nFt
  | Int
nFt Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 = do
      MVector s a
dataFt <- Int -> a -> ST s (MVector (PrimState (ST s)) a)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Int -> a -> m (MVector (PrimState m) a)
VUM.replicate Int
nFt a
0
      FenwickTree s a -> ST s (FenwickTree s a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FenwickTree {Int
MVector s a
nFt :: Int
dataFt :: MVector s a
nFt :: Int
dataFt :: MVector s a
..}
  | Bool
otherwise = String -> ST s (FenwickTree s a)
forall a. HasCallStack => String -> a
error (String -> ST s (FenwickTree s a))
-> String -> ST s (FenwickTree s a)
forall a b. (a -> b) -> a -> b
$ String
"AtCoder.FenwickTree.newST: given negative size `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
nFt String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"

{-# INLINEABLE buildST #-}
buildST :: (Num a, VU.Unbox a) => VU.Vector a -> ST s (FenwickTree s a)
buildST :: forall a s. (Num a, Unbox a) => Vector a -> ST s (FenwickTree s a)
buildST Vector a
xs = do
  FenwickTree s a
ft <- Int -> ST s (FenwickTree (PrimState (ST s)) a)
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
Int -> m (FenwickTree (PrimState m) a)
new (Int -> ST s (FenwickTree (PrimState (ST s)) a))
-> Int -> ST s (FenwickTree (PrimState (ST s)) a)
forall a b. (a -> b) -> a -> b
$ Vector a -> Int
forall a. Unbox a => Vector a -> Int
VU.length Vector a
xs
  Vector a -> (Int -> a -> ST s ()) -> ST s ()
forall (m :: * -> *) a b.
(Monad m, Unbox a) =>
Vector a -> (Int -> a -> m b) -> m ()
VU.iforM_ Vector a
xs ((Int -> a -> ST s ()) -> ST s ())
-> (Int -> a -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ FenwickTree (PrimState (ST s)) a -> Int -> a -> ST s ()
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Num a, Unbox a) =>
FenwickTree (PrimState m) a -> Int -> a -> m ()
add FenwickTree s a
FenwickTree (PrimState (ST s)) a
ft
  FenwickTree s a -> ST s (FenwickTree s a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FenwickTree s a
ft

{-# INLINEABLE addST #-}
addST :: (HasCallStack, Num a, VU.Unbox a) => FenwickTree s a -> Int -> a -> ST s ()
addST :: forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> a -> ST s ()
addST FenwickTree {Int
MVector s a
nFt :: forall s a. FenwickTree s a -> Int
dataFt :: forall s a. FenwickTree s a -> MVector s a
nFt :: Int
dataFt :: MVector s a
..} Int
p0 a
x = do
  let !()
_ = HasCallStack => String -> Int -> Int -> ()
String -> Int -> Int -> ()
ACIA.checkIndex String
"AtCoder.FenwickTree.addST" Int
p0 Int
nFt
  let p1 :: Int
p1 = Int
p0 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
  (((Int -> ST s ()) -> Int -> ST s ()) -> Int -> ST s ())
-> Int -> ((Int -> ST s ()) -> Int -> ST s ()) -> ST s ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((Int -> ST s ()) -> Int -> ST s ()) -> Int -> ST s ()
forall a. (a -> a) -> a
fix Int
p1 (((Int -> ST s ()) -> Int -> ST s ()) -> ST s ())
-> ((Int -> ST s ()) -> Int -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \Int -> ST s ()
loop Int
p -> do
    Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
nFt) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
      MVector (PrimState (ST s)) a -> (a -> a) -> Int -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> a) -> Int -> m ()
VGM.modify MVector s a
MVector (PrimState (ST s)) a
dataFt (a -> a -> a
forall a. Num a => a -> a -> a
+ a
x) (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
      Int -> ST s ()
loop (Int -> ST s ()) -> Int -> ST s ()
forall a b. (a -> b) -> a -> b
$! Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
p Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (-Int
p))

{-# INLINEABLE prefixSumST #-}
prefixSumST :: (Num a, VU.Unbox a) => FenwickTree s a -> Int -> ST s a
prefixSumST :: forall a s. (Num a, Unbox a) => FenwickTree s a -> Int -> ST s a
prefixSumST FenwickTree {Int
MVector s a
nFt :: forall s a. FenwickTree s a -> Int
dataFt :: forall s a. FenwickTree s a -> MVector s a
nFt :: Int
dataFt :: MVector s a
..} = a -> Int -> ST s a
forall {f :: * -> *}.
(PrimState f ~ s, PrimMonad f) =>
a -> Int -> f a
inner a
0
  where
    inner :: a -> Int -> f a
inner !a
acc !Int
r
      | Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = a -> f a
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
acc
      | Bool
otherwise = do
          a
dx <- MVector (PrimState f) a -> Int -> f a
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector s a
MVector (PrimState f) a
dataFt (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
          a -> Int -> f a
inner (a
acc a -> a -> a
forall a. Num a => a -> a -> a
+ a
dx) (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
r Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (-Int
r))

{-# INLINEABLE sumST #-}
sumST :: (HasCallStack, Num a, VU.Unbox a) => FenwickTree s a -> Int -> Int -> ST s a
sumST :: forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s a
sumST ft :: FenwickTree s a
ft@FenwickTree {Int
nFt :: forall s a. FenwickTree s a -> Int
nFt :: Int
nFt} Int
l Int
r
  | Bool -> Bool
not (Int -> Int -> Int -> Bool
ACIA.testInterval Int
l Int
r Int
nFt) = String -> Int -> Int -> Int -> ST s a
forall a. HasCallStack => String -> Int -> Int -> Int -> a
ACIA.errorInterval String
"AtCoder.FenwickTree.sumST" Int
l Int
r Int
nFt
  | Bool
otherwise = FenwickTree s a -> Int -> Int -> ST s a
forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s a
unsafeSumST FenwickTree s a
ft Int
l Int
r

{-# INLINEABLE sumMaybeST #-}
sumMaybeST :: (HasCallStack, Num a, VU.Unbox a) => FenwickTree s a -> Int -> Int -> ST s (Maybe a)
sumMaybeST :: forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s (Maybe a)
sumMaybeST ft :: FenwickTree s a
ft@FenwickTree {Int
nFt :: forall s a. FenwickTree s a -> Int
nFt :: Int
nFt} Int
l Int
r
  | Bool -> Bool
not (Int -> Int -> Int -> Bool
ACIA.testInterval Int
l Int
r Int
nFt) = Maybe a -> ST s (Maybe a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
  | Bool
otherwise = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> ST s a -> ST s (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FenwickTree s a -> Int -> Int -> ST s a
forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s a
unsafeSumST FenwickTree s a
ft Int
l Int
r

{-# INLINEABLE unsafeSumST #-}
unsafeSumST :: (HasCallStack, Num a, VU.Unbox a) => FenwickTree s a -> Int -> Int -> ST s a
unsafeSumST :: forall a s.
(HasCallStack, Num a, Unbox a) =>
FenwickTree s a -> Int -> Int -> ST s a
unsafeSumST FenwickTree s a
ft Int
l Int
r = do
  a
xr <- FenwickTree s a -> Int -> ST s a
forall a s. (Num a, Unbox a) => FenwickTree s a -> Int -> ST s a
prefixSumST FenwickTree s a
ft Int
r
  a
xl <- FenwickTree s a -> Int -> ST s a
forall a s. (Num a, Unbox a) => FenwickTree s a -> Int -> ST s a
prefixSumST FenwickTree s a
ft Int
l
  a -> ST s a
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> ST s a) -> a -> ST s a
forall a b. (a -> b) -> a -> b
$! a
xr a -> a -> a
forall a. Num a => a -> a -> a
- a
xl