{-# LANGUAGE TypeFamilies #-}
module AtCoder.Extra.DynSparseSegTree
(
Raw.DynSparseSegTree (..),
P.Handle (..),
new,
recommendedCapacity,
newRoot,
write,
modify,
modifyM,
prod,
allProd,
maxRight,
maxRightM,
)
where
import AtCoder.Extra.DynSparseSegTree.Raw qualified as Raw
import AtCoder.Extra.Pool qualified as P
import Control.Monad.Primitive (PrimMonad, PrimState, stToPrim)
import Data.Vector.Generic.Mutable qualified as VGM
import Data.Vector.Unboxed qualified as VU
import GHC.Stack (HasCallStack)
import Prelude hiding (read)
{-# INLINE new #-}
new ::
(HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) =>
Int ->
Int ->
Int ->
m (Raw.DynSparseSegTree (PrimState m) a)
new :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Int -> Int -> Int -> m (DynSparseSegTree (PrimState m) a)
new Int
nDsst Int
l Int
r = ST (PrimState m) (DynSparseSegTree (PrimState m) a)
-> m (DynSparseSegTree (PrimState m) a)
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) (DynSparseSegTree (PrimState m) a)
-> m (DynSparseSegTree (PrimState m) a))
-> ST (PrimState m) (DynSparseSegTree (PrimState m) a)
-> m (DynSparseSegTree (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ Bool
-> Int
-> Int
-> Int
-> ST (PrimState m) (DynSparseSegTree (PrimState m) a)
forall a s.
(HasCallStack, Unbox a) =>
Bool -> Int -> Int -> Int -> ST s (DynSparseSegTree s a)
Raw.newST Bool
False Int
nDsst Int
l Int
r
{-# INLINE recommendedCapacity #-}
recommendedCapacity :: Int -> Int -> Int
recommendedCapacity :: Int -> Int -> Int
recommendedCapacity Int
_ Int
q = Int
q
newRoot :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> m (P.Handle (PrimState m))
newRoot :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a -> m (Handle (PrimState m))
newRoot DynSparseSegTree (PrimState m) a
dst = ST (PrimState m) (Handle (PrimState m)) -> m (Handle (PrimState m))
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) (Handle (PrimState m))
-> m (Handle (PrimState m)))
-> ST (PrimState m) (Handle (PrimState m))
-> m (Handle (PrimState m))
forall a b. (a -> b) -> a -> b
$ Index -> ST (PrimState m) (Handle (PrimState m))
Index -> ST (PrimState m) (Handle (PrimState (ST (PrimState m))))
forall (m :: * -> *).
PrimMonad m =>
Index -> m (Handle (PrimState m))
P.newHandle (Index -> ST (PrimState m) (Handle (PrimState m)))
-> ST (PrimState m) Index
-> ST (PrimState m) (Handle (PrimState m))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< DynSparseSegTree (PrimState m) a -> ST (PrimState m) Index
forall a s.
(HasCallStack, Monoid a, Unbox a) =>
DynSparseSegTree s a -> ST s Index
Raw.newRootST DynSparseSegTree (PrimState m) a
dst
{-# INLINE write #-}
write :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> Int -> a -> m ()
write :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Handle (PrimState m) -> Int -> a -> m ()
write DynSparseSegTree (PrimState m) a
dst (P.Handle MVector (PrimState m) Index
handle) Int
i 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
$ do
MVector (PrimState (ST (PrimState m))) Index
-> (Index -> ST (PrimState m) Index) -> Int -> ST (PrimState m) ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> m a) -> Int -> m ()
VGM.modifyM
MVector (PrimState m) Index
MVector (PrimState (ST (PrimState m))) Index
handle
(\Index
root -> DynSparseSegTree (PrimState (ST (PrimState m))) a
-> Index
-> (a -> ST (PrimState m) a)
-> Int
-> ST (PrimState m) Index
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Index -> (a -> m a) -> Int -> m Index
Raw.modifyMST DynSparseSegTree (PrimState m) a
DynSparseSegTree (PrimState (ST (PrimState m))) a
dst Index
root (a -> ST (PrimState m) a
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> ST (PrimState m) a) -> (a -> a) -> a -> ST (PrimState m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a -> a
forall a b. a -> b -> a
const a
x) Int
i)
Int
0
{-# INLINE modify #-}
modify :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> (a -> a) -> Int -> m ()
modify :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Handle (PrimState m) -> (a -> a) -> Int -> m ()
modify DynSparseSegTree (PrimState m) a
dst (P.Handle MVector (PrimState m) Index
handle) a -> a
f Int
i = 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
$ do
MVector (PrimState (ST (PrimState m))) Index
-> (Index -> ST (PrimState m) Index) -> Int -> ST (PrimState m) ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> m a) -> Int -> m ()
VGM.modifyM
MVector (PrimState m) Index
MVector (PrimState (ST (PrimState m))) Index
handle
(\Index
root -> DynSparseSegTree (PrimState (ST (PrimState m))) a
-> Index
-> (a -> ST (PrimState m) a)
-> Int
-> ST (PrimState m) Index
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Index -> (a -> m a) -> Int -> m Index
Raw.modifyMST DynSparseSegTree (PrimState m) a
DynSparseSegTree (PrimState (ST (PrimState m))) a
dst Index
root (a -> ST (PrimState m) a
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> ST (PrimState m) a) -> (a -> a) -> a -> ST (PrimState m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f) Int
i)
Int
0
{-# INLINE modifyM #-}
modifyM :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> (a -> m a) -> Int -> m ()
modifyM :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Handle (PrimState m) -> (a -> m a) -> Int -> m ()
modifyM DynSparseSegTree (PrimState m) a
dst (P.Handle MVector (PrimState m) Index
handle) a -> m a
f Int
i = do
MVector (PrimState m) Index -> (Index -> m Index) -> Int -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> m a) -> Int -> m ()
VGM.modifyM
MVector (PrimState m) Index
handle
(\Index
root -> DynSparseSegTree (PrimState m) a
-> Index -> (a -> m a) -> Int -> m Index
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Index -> (a -> m a) -> Int -> m Index
Raw.modifyMST DynSparseSegTree (PrimState m) a
dst Index
root a -> m a
f Int
i)
Int
0
{-# INLINE prod #-}
prod :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> Int -> Int -> m a
prod :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Handle (PrimState m) -> Int -> Int -> m a
prod DynSparseSegTree (PrimState m) a
dst (P.Handle MVector (PrimState m) Index
handle) 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
$ do
Index
root <- MVector (PrimState (ST (PrimState m))) Index
-> Int -> ST (PrimState m) Index
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) Index
MVector (PrimState (ST (PrimState m))) Index
handle Int
0
DynSparseSegTree (PrimState m) a
-> Index -> Int -> Int -> ST (PrimState m) a
forall a s.
(HasCallStack, Monoid a, Unbox a) =>
DynSparseSegTree s a -> Index -> Int -> Int -> ST s a
Raw.prodST DynSparseSegTree (PrimState m) a
dst Index
root Int
l Int
r
{-# INLINE allProd #-}
allProd :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> m a
allProd :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a -> Handle (PrimState m) -> m a
allProd dst :: DynSparseSegTree (PrimState m) a
dst@Raw.DynSparseSegTree {Int
l0Dsst :: Int
l0Dsst :: forall s a. DynSparseSegTree s a -> Int
l0Dsst, Int
r0Dsst :: Int
r0Dsst :: forall s a. DynSparseSegTree s a -> Int
r0Dsst} (P.Handle MVector (PrimState m) Index
handle) = 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
$ do
Index
root <- MVector (PrimState (ST (PrimState m))) Index
-> Int -> ST (PrimState m) Index
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) Index
MVector (PrimState (ST (PrimState m))) Index
handle Int
0
DynSparseSegTree (PrimState m) a
-> Index -> Int -> Int -> ST (PrimState m) a
forall a s.
(HasCallStack, Monoid a, Unbox a) =>
DynSparseSegTree s a -> Index -> Int -> Int -> ST s a
Raw.prodST DynSparseSegTree (PrimState m) a
dst Index
root Int
l0Dsst Int
r0Dsst
{-# INLINE maxRight #-}
maxRight :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> (a -> Bool) -> m Int
maxRight :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Handle (PrimState m) -> (a -> Bool) -> m Int
maxRight DynSparseSegTree (PrimState m) a
dst (P.Handle MVector (PrimState m) Index
handle) a -> Bool
f = do
Index
root <- MVector (PrimState m) Index -> Int -> m Index
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) Index
handle Int
0
DynSparseSegTree (PrimState m) a -> Index -> (a -> m Bool) -> m Int
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a -> Index -> (a -> m Bool) -> m Int
Raw.maxRightM DynSparseSegTree (PrimState m) a
dst Index
root (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)
{-# INLINE maxRightM #-}
maxRightM :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Raw.DynSparseSegTree (PrimState m) a -> P.Handle (PrimState m) -> (a -> m Bool) -> m Int
maxRightM :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a
-> Handle (PrimState m) -> (a -> m Bool) -> m Int
maxRightM DynSparseSegTree (PrimState m) a
dst (P.Handle MVector (PrimState m) Index
handle) a -> m Bool
f = do
Index
root <- MVector (PrimState m) Index -> Int -> m Index
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VGM.read MVector (PrimState m) Index
handle Int
0
DynSparseSegTree (PrimState m) a -> Index -> (a -> m Bool) -> m Int
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
DynSparseSegTree (PrimState m) a -> Index -> (a -> m Bool) -> m Int
Raw.maxRightM DynSparseSegTree (PrimState m) a
dst Index
root a -> m Bool
f