{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
module AtCoder.Extra.Tree.Lct
(
Lct (..),
Vertex,
new,
newInv,
build,
buildInv,
write,
modify,
modifyM,
link,
cut,
evert,
expose,
expose_,
root,
parent,
jump,
lca,
prodPath,
prodSubtree,
)
where
import AtCoder.Internal.Assert qualified as ACIA
import Control.Monad (unless, when)
import Control.Monad.Primitive (PrimMonad, PrimState, stToPrim)
import Control.Monad.ST (ST)
import Data.Bit
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)
type Vertex = Int
{-# INLINE undefLct #-}
undefLct :: Vertex
undefLct :: Vertex
undefLct = -Vertex
1
{-# INLINE nullLct #-}
nullLct :: Vertex -> Bool
nullLct :: Vertex -> Bool
nullLct = (Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== -Vertex
1)
data Lct s a = Lct
{
forall s a. Lct s a -> Vertex
nLct :: {-# UNPACK #-} !Int,
forall s a. Lct s a -> MVector s Vertex
lLct :: !(VUM.MVector s Vertex),
forall s a. Lct s a -> MVector s Vertex
rLct :: !(VUM.MVector s Vertex),
forall s a. Lct s a -> MVector s Vertex
pLct :: !(VUM.MVector s Vertex),
forall s a. Lct s a -> MVector s Vertex
sLct :: !(VUM.MVector s Int),
forall s a. Lct s a -> MVector s Bit
revLct :: !(VUM.MVector s Bit),
forall s a. Lct s a -> MVector s a
vLct :: !(VUM.MVector s a),
forall s a. Lct s a -> MVector s a
prodLct :: !(VUM.MVector s a),
forall s a. Lct s a -> MVector s a
dualProdLct :: !(VUM.MVector s a),
forall s a. Lct s a -> MVector s a
midLct :: !(VUM.MVector s a),
forall s a. Lct s a -> MVector s a
subtreeProdLct :: !(VUM.MVector s a),
forall s a. Lct s a -> a -> a
invOpLct :: !(a -> a)
}
{-# INLINE new #-}
new :: (PrimMonad m, Monoid a, VU.Unbox a) => Int -> m (Lct (PrimState m) a)
new :: forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
Vertex -> m (Lct (PrimState m) a)
new = (a -> a) -> Vertex -> m (Lct (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
(a -> a) -> Vertex -> m (Lct (PrimState m) a)
newInv a -> a
forall a. a -> a
id
{-# INLINE newInv #-}
newInv :: (PrimMonad m, Monoid a, VU.Unbox a) => (a -> a) -> Int -> m (Lct (PrimState m) a)
newInv :: forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
(a -> a) -> Vertex -> m (Lct (PrimState m) a)
newInv !a -> a
invOpLct Vertex
nLct = (a -> a)
-> Vector a -> Vector (Vertex, Vertex) -> m (Lct (PrimState m) a)
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
(a -> a)
-> Vector a -> Vector (Vertex, Vertex) -> m (Lct (PrimState m) a)
buildInv a -> a
invOpLct (Vertex -> a -> Vector a
forall a. Unbox a => Vertex -> a -> Vector a
VU.replicate Vertex
nLct a
forall a. Monoid a => a
mempty) Vector (Vertex, Vertex)
forall a. Unbox a => Vector a
VU.empty
{-# INLINE build #-}
build ::
(HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) =>
VU.Vector a ->
VU.Vector (Vertex, Vertex) ->
m (Lct (PrimState m) a)
build :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Vector a -> Vector (Vertex, Vertex) -> m (Lct (PrimState m) a)
build = (a -> a)
-> Vector a -> Vector (Vertex, Vertex) -> m (Lct (PrimState m) a)
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
(a -> a)
-> Vector a -> Vector (Vertex, Vertex) -> m (Lct (PrimState m) a)
buildInv a -> a
forall a. a -> a
id
{-# INLINE buildInv #-}
buildInv ::
(HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) =>
(a -> a) ->
VU.Vector a ->
VU.Vector (Vertex, Vertex) ->
m (Lct (PrimState m) a)
buildInv :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
(a -> a)
-> Vector a -> Vector (Vertex, Vertex) -> m (Lct (PrimState m) a)
buildInv !a -> a
invOpLct Vector a
xs Vector (Vertex, Vertex)
es = do
Lct (PrimState m) a
lct <- do
let !nLct :: Vertex
nLct = Vector a -> Vertex
forall a. Unbox a => Vector a -> Vertex
VU.length Vector a
xs
MVector (PrimState m) Vertex
lLct <- Vertex -> Vertex -> m (MVector (PrimState m) Vertex)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct Vertex
undefLct
MVector (PrimState m) Vertex
rLct <- Vertex -> Vertex -> m (MVector (PrimState m) Vertex)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct Vertex
undefLct
MVector (PrimState m) Vertex
pLct <- Vertex -> Vertex -> m (MVector (PrimState m) Vertex)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct Vertex
undefLct
MVector (PrimState m) Vertex
sLct <- Vertex -> Vertex -> m (MVector (PrimState m) Vertex)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct Vertex
0
MVector (PrimState m) Bit
revLct <- Vertex -> Bit -> m (MVector (PrimState m) Bit)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct (Bool -> Bit
Bit Bool
False)
MVector (PrimState m) a
vLct <- Vector a -> m (MVector (PrimState m) a)
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
VU.thaw Vector a
xs
MVector (PrimState m) a
prodLct <- Vertex -> a -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct a
forall a. Monoid a => a
mempty
MVector (PrimState m) a
dualProdLct <- Vertex -> a -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct a
forall a. Monoid a => a
mempty
MVector (PrimState m) a
midLct <- Vertex -> a -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct a
forall a. Monoid a => a
mempty
MVector (PrimState m) a
subtreeProdLct <- Vertex -> a -> m (MVector (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Vertex -> a -> m (MVector (PrimState m) a)
VUM.replicate Vertex
nLct a
forall a. Monoid a => a
mempty
Lct (PrimState m) a -> m (Lct (PrimState m) a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Lct {Vertex
MVector (PrimState m) a
MVector (PrimState m) Vertex
MVector (PrimState m) Bit
a -> a
nLct :: Vertex
lLct :: MVector (PrimState m) Vertex
rLct :: MVector (PrimState m) Vertex
pLct :: MVector (PrimState m) Vertex
sLct :: MVector (PrimState m) Vertex
revLct :: MVector (PrimState m) Bit
vLct :: MVector (PrimState m) a
prodLct :: MVector (PrimState m) a
dualProdLct :: MVector (PrimState m) a
midLct :: MVector (PrimState m) a
subtreeProdLct :: MVector (PrimState m) a
invOpLct :: a -> a
invOpLct :: a -> a
nLct :: Vertex
lLct :: MVector (PrimState m) Vertex
rLct :: MVector (PrimState m) Vertex
pLct :: MVector (PrimState m) Vertex
sLct :: MVector (PrimState m) Vertex
revLct :: MVector (PrimState m) Bit
vLct :: MVector (PrimState m) a
prodLct :: MVector (PrimState m) a
dualProdLct :: MVector (PrimState m) a
midLct :: MVector (PrimState m) a
subtreeProdLct :: MVector (PrimState m) a
..}
Vector (Vertex, Vertex) -> ((Vertex, Vertex) -> m ()) -> m ()
forall (m :: * -> *) a b.
(Monad m, Unbox a) =>
Vector a -> (a -> m b) -> m ()
VU.forM_ Vector (Vertex, Vertex)
es (((Vertex, Vertex) -> m ()) -> m ())
-> ((Vertex, Vertex) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \(!Vertex
u, !Vertex
v) -> do
Lct (PrimState m) a -> Vertex -> Vertex -> m ()
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> m ()
link Lct (PrimState m) a
lct Vertex
u Vertex
v
Lct (PrimState m) a -> m (Lct (PrimState m) a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Lct (PrimState m) a
lct
{-# INLINEABLE rotateST #-}
rotateST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST :: forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST lct :: Lct s a
lct@Lct {MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: MVector s Vertex
pLct, MVector s Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector s Vertex
lLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct} Vertex
v = do
Vertex
p <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
v
Vertex
pp <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
p
Vertex
pl <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
p
Vertex
c <-
if Vertex
pl Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
v
then do
Vertex
c <- MVector (PrimState (ST s)) Vertex
-> Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m a
VGM.unsafeExchange MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
v Vertex
p
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
p Vertex
c
Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
c
else do
Vertex
c <- MVector (PrimState (ST s)) Vertex
-> Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m a
VGM.unsafeExchange MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
v Vertex
p
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
p Vertex
c
Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
c
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST Lct s a
lct Vertex
p
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST Lct s a
lct Vertex
v
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Vertex -> Bool
nullLct Vertex
pp) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
Vertex
ppl <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
pp
if Vertex
ppl Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
p
then MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
pp Vertex
v
else do
Vertex
ppr <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
pp
if Vertex
ppr Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
p
then MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
pp Vertex
v
else do
Lct s a -> Vertex -> Vertex -> Vertex -> ST s ()
forall s a. Lct s a -> Vertex -> Vertex -> Vertex -> ST s ()
changeLightST Lct s a
lct Vertex
pp Vertex
p Vertex
v
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
v Vertex
pp
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
p Vertex
v
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Vertex -> Bool
nullLct Vertex
c) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
c Vertex
p
{-# INLINEABLE splayST #-}
splayST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> ST s ()
splayST :: forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
splayST lct :: Lct s a
lct@Lct {MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: MVector s Vertex
pLct} Vertex
c = do
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
c
let inner :: ST s ()
inner = do
Bool
isRootC <- Lct s a -> Vertex -> ST s Bool
forall s a. Lct s a -> Vertex -> ST s Bool
isRootNodeST Lct s a
lct Vertex
c
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
isRootC (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
Vertex
p <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
c
Vertex
pp <- if Vertex -> Bool
nullLct Vertex
p then Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
undefLct else MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
p
NodePlaceLct
placeP <- Lct s a -> Vertex -> ST s NodePlaceLct
forall s a. Lct s a -> Vertex -> ST s NodePlaceLct
nodePlaceST Lct s a
lct Vertex
p
if NodePlaceLct
placeP NodePlaceLct -> NodePlaceLct -> Bool
forall a. Eq a => a -> a -> Bool
== NodePlaceLct
RootNodeLct
then do
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
p
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
c
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST Lct s a
lct Vertex
c
else do
NodePlaceLct
placeC <- Lct s a -> Vertex -> ST s NodePlaceLct
forall s a. Lct s a -> Vertex -> ST s NodePlaceLct
nodePlaceST Lct s a
lct Vertex
c
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
pp
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
p
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
c
if NodePlaceLct
placeC NodePlaceLct -> NodePlaceLct -> Bool
forall a. Eq a => a -> a -> Bool
== NodePlaceLct
placeP
then do
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST Lct s a
lct Vertex
p
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST Lct s a
lct Vertex
c
else do
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST Lct s a
lct Vertex
c
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
rotateST Lct s a
lct Vertex
c
ST s ()
inner
ST s ()
inner
{-# INLINEABLE isRootNodeST #-}
isRootNodeST :: Lct s a -> Vertex -> ST s Bool
isRootNodeST :: forall s a. Lct s a -> Vertex -> ST s Bool
isRootNodeST Lct s a
lct Vertex
v = do
(NodePlaceLct -> NodePlaceLct -> Bool
forall a. Eq a => a -> a -> Bool
== NodePlaceLct
RootNodeLct) (NodePlaceLct -> Bool) -> ST s NodePlaceLct -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lct s a -> Vertex -> ST s NodePlaceLct
forall s a. Lct s a -> Vertex -> ST s NodePlaceLct
nodePlaceST Lct s a
lct Vertex
v
data NodePlaceLct = RootNodeLct | LeftNodeLct | RightNodeLct
deriving (NodePlaceLct -> NodePlaceLct -> Bool
(NodePlaceLct -> NodePlaceLct -> Bool)
-> (NodePlaceLct -> NodePlaceLct -> Bool) -> Eq NodePlaceLct
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NodePlaceLct -> NodePlaceLct -> Bool
== :: NodePlaceLct -> NodePlaceLct -> Bool
$c/= :: NodePlaceLct -> NodePlaceLct -> Bool
/= :: NodePlaceLct -> NodePlaceLct -> Bool
Eq)
{-# INLINEABLE nodePlaceST #-}
nodePlaceST :: Lct s a -> Vertex -> ST s NodePlaceLct
nodePlaceST :: forall s a. Lct s a -> Vertex -> ST s NodePlaceLct
nodePlaceST Lct {MVector s Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector s Vertex
lLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct, MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: MVector s Vertex
pLct} Vertex
v = do
Vertex
p <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
v
if Vertex -> Bool
nullLct Vertex
p
then NodePlaceLct -> ST s NodePlaceLct
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NodePlaceLct
RootNodeLct
else do
Vertex
pl <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
p
if Vertex
pl Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
v
then NodePlaceLct -> ST s NodePlaceLct
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NodePlaceLct
LeftNodeLct
else do
Vertex
pr <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
p
if Vertex
pr Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
v
then NodePlaceLct -> ST s NodePlaceLct
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NodePlaceLct
RightNodeLct
else NodePlaceLct -> ST s NodePlaceLct
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NodePlaceLct
RootNodeLct
{-# INLINEABLE pushNodeST #-}
pushNodeST :: (VU.Unbox a) => Lct s a -> Vertex -> ST s ()
pushNodeST :: forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST lct :: Lct s a
lct@Lct {MVector s Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector s Vertex
lLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct, MVector s Bit
revLct :: forall s a. Lct s a -> MVector s Bit
revLct :: MVector s Bit
revLct} Vertex
v = do
Bit Bool
b <- MVector (PrimState (ST s)) Bit -> Vertex -> Bit -> ST s Bit
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m a
VGM.unsafeExchange MVector s Bit
MVector (PrimState (ST s)) Bit
revLct Vertex
v (Bool -> Bit
Bit Bool
False)
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
b (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
Vertex
l <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
v
Vertex
r <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
v
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Vertex -> Bool
nullLct Vertex
l) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
reverseNodeST Lct s a
lct Vertex
l
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Vertex -> Bool
nullLct Vertex
r) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
reverseNodeST Lct s a
lct Vertex
r
{-# INLINEABLE reverseNodeST #-}
reverseNodeST :: (VU.Unbox a) => Lct s a -> Vertex -> ST s ()
reverseNodeST :: forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
reverseNodeST lct :: Lct s a
lct@Lct {MVector s Bit
revLct :: forall s a. Lct s a -> MVector s Bit
revLct :: MVector s Bit
revLct} Vertex
i = do
MVector (PrimState (ST s)) Bit -> (Bit -> Bit) -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> a) -> Vertex -> m ()
VGM.unsafeModify MVector s Bit
MVector (PrimState (ST s)) Bit
revLct (Bit -> Bit -> Bit
forall a. Bits a => a -> a -> a
xor (Bool -> Bit
Bit Bool
True)) Vertex
i
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
swapLrNodeST Lct s a
lct Vertex
i
{-# INLINEABLE swapLrNodeST #-}
swapLrNodeST :: (VU.Unbox a) => Lct s a -> Vertex -> ST s ()
swapLrNodeST :: forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
swapLrNodeST Lct {MVector s Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector s Vertex
lLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct, MVector s a
prodLct :: forall s a. Lct s a -> MVector s a
prodLct :: MVector s a
prodLct, MVector s a
dualProdLct :: forall s a. Lct s a -> MVector s a
dualProdLct :: MVector s a
dualProdLct} Vertex
i = do
MVector (PrimState (ST s)) Vertex
-> (Vertex -> ST s Vertex) -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> m a) -> Vertex -> m ()
VGM.unsafeModifyM MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct (MVector (PrimState (ST s)) Vertex
-> Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m a
VGM.unsafeExchange MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
i) Vertex
i
MVector (PrimState (ST s)) a -> (a -> ST s a) -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> m a) -> Vertex -> m ()
VGM.unsafeModifyM MVector s a
MVector (PrimState (ST s)) a
prodLct (MVector (PrimState (ST s)) a -> Vertex -> a -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m a
VGM.unsafeExchange MVector s a
MVector (PrimState (ST s)) a
dualProdLct Vertex
i) Vertex
i
{-# INLINEABLE updateNodeST #-}
updateNodeST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST :: forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST Lct {Vertex
MVector s a
MVector s Vertex
MVector s Bit
a -> a
nLct :: forall s a. Lct s a -> Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
sLct :: forall s a. Lct s a -> MVector s Vertex
revLct :: forall s a. Lct s a -> MVector s Bit
vLct :: forall s a. Lct s a -> MVector s a
prodLct :: forall s a. Lct s a -> MVector s a
dualProdLct :: forall s a. Lct s a -> MVector s a
midLct :: forall s a. Lct s a -> MVector s a
subtreeProdLct :: forall s a. Lct s a -> MVector s a
invOpLct :: forall s a. Lct s a -> a -> a
nLct :: Vertex
lLct :: MVector s Vertex
rLct :: MVector s Vertex
pLct :: MVector s Vertex
sLct :: MVector s Vertex
revLct :: MVector s Bit
vLct :: MVector s a
prodLct :: MVector s a
dualProdLct :: MVector s a
midLct :: MVector s a
subtreeProdLct :: MVector s a
invOpLct :: a -> a
..} Vertex
i = do
Vertex
l <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
i
Vertex
r <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
i
a
v <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
vLct Vertex
i
a
m <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
midLct Vertex
i
(!Vertex
size', !a
prod', !a
dualProd', !a
subtreeProd') <-
if Vertex -> Bool
nullLct Vertex
l
then (Vertex, a, a, a) -> ST s (Vertex, a, a, a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vertex
1 :: Int, a
v, a
v, a
v a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
m)
else do
Vertex
lSize <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
sLct Vertex
l
a
lProd <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
prodLct Vertex
l
a
lDualProd <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
dualProdLct Vertex
l
a
lSubtreeProd <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
subtreeProdLct Vertex
l
(Vertex, a, a, a) -> ST s (Vertex, a, a, a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vertex
lSize Vertex -> Vertex -> Vertex
forall a. Num a => a -> a -> a
+ Vertex
1, a
lProd a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
v, a
v a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
lDualProd, a
lSubtreeProd a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
v a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
m)
(!Vertex
size'', !a
prod'', !a
dualProd'', !a
subtreeProd'') <-
if Vertex -> Bool
nullLct Vertex
r
then (Vertex, a, a, a) -> ST s (Vertex, a, a, a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vertex
size', a
prod', a
dualProd', a
subtreeProd')
else do
Vertex
rSize <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
sLct Vertex
r
a
rProd <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
prodLct Vertex
r
a
rDualProd <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
dualProdLct Vertex
r
a
rSubtreeProd <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
subtreeProdLct Vertex
r
(Vertex, a, a, a) -> ST s (Vertex, a, a, a)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vertex
size' Vertex -> Vertex -> Vertex
forall a. Num a => a -> a -> a
+ Vertex
rSize, a
prod' a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
rProd, a
rDualProd a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
dualProd', a
subtreeProd' a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
rSubtreeProd)
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
sLct Vertex
i Vertex
size''
MVector (PrimState (ST s)) a -> Vertex -> a -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s a
MVector (PrimState (ST s)) a
prodLct Vertex
i a
prod''
MVector (PrimState (ST s)) a -> Vertex -> a -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s a
MVector (PrimState (ST s)) a
dualProdLct Vertex
i a
dualProd''
MVector (PrimState (ST s)) a -> Vertex -> a -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s a
MVector (PrimState (ST s)) a
subtreeProdLct Vertex
i a
subtreeProd''
{-# INLINEABLE addLightST #-}
addLightST :: (Semigroup a, VU.Unbox a) => Lct s a -> Vertex -> Vertex -> ST s ()
addLightST :: forall a s.
(Semigroup a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
addLightST Lct {MVector s a
subtreeProdLct :: forall s a. Lct s a -> MVector s a
subtreeProdLct :: MVector s a
subtreeProdLct, MVector s a
midLct :: forall s a. Lct s a -> MVector s a
midLct :: MVector s a
midLct} Vertex
p Vertex
c = do
a
newChild <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
subtreeProdLct Vertex
c
MVector (PrimState (ST s)) a -> (a -> a) -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> a) -> Vertex -> m ()
VGM.unsafeModify MVector s a
MVector (PrimState (ST s)) a
midLct (a
newChild <>) Vertex
p
{-# INLINEABLE changeLightST #-}
changeLightST :: Lct s a -> Vertex -> Vertex -> Vertex -> ST s ()
changeLightST :: forall s a. Lct s a -> Vertex -> Vertex -> Vertex -> ST s ()
changeLightST Lct s a
_lct Vertex
_u Vertex
_v Vertex
_p = do
() -> ST s ()
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
{-# INLINEABLE eraseLightST #-}
eraseLightST :: (Semigroup a, VU.Unbox a) => Lct s a -> Vertex -> Vertex -> ST s ()
eraseLightST :: forall a s.
(Semigroup a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
eraseLightST Lct {MVector s a
subtreeProdLct :: forall s a. Lct s a -> MVector s a
subtreeProdLct :: MVector s a
subtreeProdLct, MVector s a
midLct :: forall s a. Lct s a -> MVector s a
midLct :: MVector s a
midLct, a -> a
invOpLct :: forall s a. Lct s a -> a -> a
invOpLct :: a -> a
invOpLct} Vertex
p Vertex
c = do
a
sub <- MVector (PrimState (ST s)) a -> Vertex -> ST s a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s a
MVector (PrimState (ST s)) a
subtreeProdLct Vertex
c
let !sub' :: a
sub' = a -> a
invOpLct a
sub
MVector (PrimState (ST s)) a -> (a -> a) -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> a) -> Vertex -> m ()
VGM.unsafeModify MVector s a
MVector (PrimState (ST s)) a
midLct (a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
sub') Vertex
p
{-# INLINE write #-}
write :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> a -> m ()
write :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> a -> m ()
write Lct (PrimState m) a
lct Vertex
v 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
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct (PrimState m) a
lct Vertex
v
MVector (PrimState (ST (PrimState m))) a
-> Vertex -> a -> ST (PrimState m) ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite (Lct (PrimState m) a -> MVector (PrimState m) a
forall s a. Lct s a -> MVector s a
vLct Lct (PrimState m) a
lct) Vertex
v a
x
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.write" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINE modify #-}
modify :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> (a -> a) -> Vertex -> m ()
modify :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> (a -> a) -> Vertex -> m ()
modify Lct (PrimState m) a
lct a -> a
f Vertex
v = 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
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct (PrimState m) a
lct Vertex
v
MVector (PrimState (ST (PrimState m))) a
-> (a -> a) -> Vertex -> ST (PrimState m) ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> a) -> Vertex -> m ()
VGM.unsafeModify (Lct (PrimState m) a -> MVector (PrimState m) a
forall s a. Lct s a -> MVector s a
vLct Lct (PrimState m) a
lct) a -> a
f Vertex
v
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.modify" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINE modifyM #-}
modifyM :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> (a -> m a) -> Vertex -> m ()
modifyM :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> (a -> m a) -> Vertex -> m ()
modifyM Lct (PrimState m) a
lct a -> m a
f Vertex
v = do
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
$ Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct (PrimState m) a
lct Vertex
v
MVector (PrimState m) a -> (a -> m a) -> Vertex -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> (a -> m a) -> Vertex -> m ()
VGM.unsafeModifyM (Lct (PrimState m) a -> MVector (PrimState m) a
forall s a. Lct s a -> MVector s a
vLct Lct (PrimState m) a
lct) a -> m a
f Vertex
v
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.modifyM" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINEABLE linkST #-}
linkST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> Vertex -> ST s ()
linkST :: forall a s.
(Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
linkST lct :: Lct s a
lct@Lct {MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: MVector s Vertex
pLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct} Vertex
c Vertex
p = do
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct s a
lct Vertex
c
Vertex
_ <- Lct s a -> Vertex -> ST s Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct s a
lct Vertex
p
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
p
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
c Vertex
p
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
p Vertex
c
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST Lct s a
lct Vertex
p
{-# INLINE link #-}
link :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> Vertex -> m ()
link :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> m ()
link Lct (PrimState m) a
lct Vertex
c Vertex
p = 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
$ Lct (PrimState m) a -> Vertex -> Vertex -> ST (PrimState m) ()
forall a s.
(Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
linkST Lct (PrimState m) a
lct Vertex
c Vertex
p
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.link" Vertex
c (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.link" Vertex
p (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINEABLE cutST #-}
cutST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> Vertex -> ST s ()
cutST :: forall a s.
(Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
cutST lct :: Lct s a
lct@Lct {MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: MVector s Vertex
pLct, MVector s Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector s Vertex
lLct} Vertex
u Vertex
v = do
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct s a
lct Vertex
u
Vertex
_ <- Lct s a -> Vertex -> ST s Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct s a
lct Vertex
v
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
u Vertex
undefLct
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
v Vertex
undefLct
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST Lct s a
lct Vertex
v
{-# INLINE cut #-}
cut :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> Vertex -> m ()
cut :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> m ()
cut Lct (PrimState m) a
lct Vertex
u Vertex
v = 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
$ Lct (PrimState m) a -> Vertex -> Vertex -> ST (PrimState m) ()
forall a s.
(Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
cutST Lct (PrimState m) a
lct Vertex
u Vertex
v
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.cut" Vertex
u (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.cut" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINEABLE evertST #-}
evertST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> ST s ()
evertST :: forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct s a
lct Vertex
v = do
Vertex
_ <- Lct s a -> Vertex -> ST s Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct s a
lct Vertex
v
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
reverseNodeST Lct s a
lct Vertex
v
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
v
{-# INLINE evert #-}
evert :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> m ()
evert :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m ()
evert Lct (PrimState m) a
lct Vertex
v = 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
$ Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct (PrimState m) a
lct Vertex
v
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.evert" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINEABLE exposeST #-}
exposeST :: (Monoid a, VU.Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST :: forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST lct :: Lct s a
lct@Lct {MVector s Vertex
pLct :: forall s a. Lct s a -> MVector s Vertex
pLct :: MVector s Vertex
pLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct} Vertex
v0 = do
let inner :: Vertex -> Vertex -> ST s Vertex
inner Vertex
v Vertex
lastRoot
| Vertex -> Bool
nullLct Vertex
v = Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
lastRoot
| Bool
otherwise = do
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
splayST Lct s a
lct Vertex
v
Vertex
r <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
v
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Vertex -> Bool
nullLct Vertex
r) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Lct s a -> Vertex -> Vertex -> ST s ()
forall a s.
(Semigroup a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
addLightST Lct s a
lct Vertex
v Vertex
r
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Vertex -> Bool
nullLct Vertex
lastRoot) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Lct s a -> Vertex -> Vertex -> ST s ()
forall a s.
(Semigroup a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
eraseLightST Lct s a
lct Vertex
v Vertex
lastRoot
MVector (PrimState (ST s)) Vertex -> Vertex -> Vertex -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> a -> m ()
VGM.unsafeWrite MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
v Vertex
lastRoot
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
updateNodeST Lct s a
lct Vertex
v
Vertex
vp <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
pLct Vertex
v
Vertex -> Vertex -> ST s Vertex
inner Vertex
vp Vertex
v
Vertex
res <- Vertex -> Vertex -> ST s Vertex
inner Vertex
v0 Vertex
undefLct
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
splayST Lct s a
lct Vertex
v0
Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
res
{-# INLINE expose #-}
expose :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> m Vertex
expose :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m Vertex
expose Lct (PrimState m) a
lct Vertex
v = ST (PrimState m) Vertex -> m Vertex
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) Vertex -> m Vertex)
-> ST (PrimState m) Vertex -> m Vertex
forall a b. (a -> b) -> a -> b
$ Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
v
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.expose_" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINE expose_ #-}
expose_ :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> m ()
expose_ :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m ()
expose_ Lct (PrimState m) a
lct Vertex
v0 = 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
Vertex
_ <- Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
v0
() -> ST (PrimState m) ()
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.expose_" Vertex
v0 (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINE root #-}
root :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Int -> m Vertex
root :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m Vertex
root lct :: Lct (PrimState m) a
lct@Lct {MVector (PrimState m) Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector (PrimState m) Vertex
lLct} Vertex
c0 = ST (PrimState m) Vertex -> m Vertex
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) Vertex -> m Vertex)
-> ST (PrimState m) Vertex -> m Vertex
forall a b. (a -> b) -> a -> b
$ do
Vertex
_ <- Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
c0
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct (PrimState m) a
lct Vertex
c0
let inner :: Vertex -> ST (PrimState m) Vertex
inner Vertex
c = do
Vertex
cl <- MVector (PrimState (ST (PrimState m))) Vertex
-> Vertex -> ST (PrimState m) Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector (PrimState m) Vertex
MVector (PrimState (ST (PrimState m))) Vertex
lLct Vertex
c
if Vertex -> Bool
nullLct Vertex
cl
then Vertex -> ST (PrimState m) Vertex
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
c
else do
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct (PrimState m) a
lct Vertex
cl
Vertex -> ST (PrimState m) Vertex
inner Vertex
cl
Vertex
c' <- Vertex -> ST (PrimState m) Vertex
inner Vertex
c0
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
splayST Lct (PrimState m) a
lct Vertex
c'
Vertex -> ST (PrimState m) Vertex
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
c'
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.root" Vertex
c0 (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINE parent #-}
parent :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Int -> m (Maybe Vertex)
parent :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m (Maybe Vertex)
parent lct :: Lct (PrimState m) a
lct@Lct {MVector (PrimState m) Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector (PrimState m) Vertex
lLct, MVector (PrimState m) Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector (PrimState m) Vertex
rLct} Vertex
x = ST (PrimState m) (Maybe Vertex) -> m (Maybe Vertex)
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) (Maybe Vertex) -> m (Maybe Vertex))
-> ST (PrimState m) (Maybe Vertex) -> m (Maybe Vertex)
forall a b. (a -> b) -> a -> b
$ do
Vertex
_ <- Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
x
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct (PrimState m) a
lct Vertex
x
Vertex
xl <- MVector (PrimState (ST (PrimState m))) Vertex
-> Vertex -> ST (PrimState m) Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector (PrimState m) Vertex
MVector (PrimState (ST (PrimState m))) Vertex
lLct Vertex
x
if Vertex -> Bool
nullLct Vertex
xl
then Maybe Vertex -> ST (PrimState m) (Maybe Vertex)
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Vertex
forall a. Maybe a
Nothing
else do
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct (PrimState m) a
lct Vertex
xl
let inner :: Vertex -> ST (PrimState m) Vertex
inner Vertex
y = do
Vertex
yr <- MVector (PrimState (ST (PrimState m))) Vertex
-> Vertex -> ST (PrimState m) Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector (PrimState m) Vertex
MVector (PrimState (ST (PrimState m))) Vertex
rLct Vertex
y
if Vertex -> Bool
nullLct Vertex
yr
then Vertex -> ST (PrimState m) Vertex
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
y
else do
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct (PrimState m) a
lct Vertex
yr
Vertex -> ST (PrimState m) Vertex
inner Vertex
yr
Vertex -> Maybe Vertex
forall a. a -> Maybe a
Just (Vertex -> Maybe Vertex)
-> ST (PrimState m) Vertex -> ST (PrimState m) (Maybe Vertex)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vertex -> ST (PrimState m) Vertex
inner Vertex
xl
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.parent" Vertex
x (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINEABLE jumpST #-}
jumpST :: (HasCallStack, Monoid a, VU.Unbox a) => Lct s a -> Vertex -> Vertex -> Int -> ST s Vertex
jumpST :: forall a s.
(HasCallStack, Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> Vertex -> ST s Vertex
jumpST lct :: Lct s a
lct@Lct {MVector s Vertex
lLct :: forall s a. Lct s a -> MVector s Vertex
lLct :: MVector s Vertex
lLct, MVector s Vertex
rLct :: forall s a. Lct s a -> MVector s Vertex
rLct :: MVector s Vertex
rLct, MVector s Vertex
sLct :: forall s a. Lct s a -> MVector s Vertex
sLct :: MVector s Vertex
sLct} Vertex
u0 Vertex
v0 Vertex
k0 = do
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct s a
lct Vertex
v0
Vertex
_ <- Lct s a -> Vertex -> ST s Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct s a
lct Vertex
u0
do
Vertex
size <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
sLct Vertex
u0
let !()
_ = HasCallStack => Bool -> String -> ()
Bool -> String -> ()
ACIA.runtimeAssert (Vertex
0 Vertex -> Vertex -> Bool
forall a. Ord a => a -> a -> Bool
<= Vertex
k0 Bool -> Bool -> Bool
&& Vertex
k0 Vertex -> Vertex -> Bool
forall a. Ord a => a -> a -> Bool
< Vertex
size) String
"invalid jump"
() -> ST s ()
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
let inner :: Vertex -> Vertex -> ST s Vertex
inner Vertex
k Vertex
u = do
Lct s a -> Vertex -> ST s ()
forall a s. Unbox a => Lct s a -> Vertex -> ST s ()
pushNodeST Lct s a
lct Vertex
u
Vertex
ur <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
rLct Vertex
u
Vertex
urSize <- if Vertex -> Bool
nullLct Vertex
ur then Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
0 else MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
sLct Vertex
ur
case Vertex -> Vertex -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Vertex
k Vertex
urSize of
Ordering
LT -> Vertex -> Vertex -> ST s Vertex
inner Vertex
k Vertex
ur
Ordering
EQ -> Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
u
Ordering
GT -> do
Vertex
ul <- MVector (PrimState (ST s)) Vertex -> Vertex -> ST s Vertex
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector s Vertex
MVector (PrimState (ST s)) Vertex
lLct Vertex
u
Vertex -> Vertex -> ST s Vertex
inner (Vertex
k Vertex -> Vertex -> Vertex
forall a. Num a => a -> a -> a
- (Vertex
urSize Vertex -> Vertex -> Vertex
forall a. Num a => a -> a -> a
+ Vertex
1)) Vertex
ul
Vertex
res <- Vertex -> Vertex -> ST s Vertex
inner Vertex
k0 Vertex
u0
Lct s a -> Vertex -> ST s ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
splayST Lct s a
lct Vertex
res
Vertex -> ST s Vertex
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Vertex
res
{-# INLINE jump #-}
jump :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> Vertex -> Int -> m Vertex
jump :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> Vertex -> m Vertex
jump Lct (PrimState m) a
lct Vertex
u Vertex
v Vertex
k = ST (PrimState m) Vertex -> m Vertex
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) Vertex -> m Vertex)
-> ST (PrimState m) Vertex -> m Vertex
forall a b. (a -> b) -> a -> b
$ Lct (PrimState m) a
-> Vertex -> Vertex -> Vertex -> ST (PrimState m) Vertex
forall a s.
(HasCallStack, Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> Vertex -> ST s Vertex
jumpST Lct (PrimState m) a
lct Vertex
u Vertex
v Vertex
k
{-# INLINE lca #-}
lca :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Int -> Int -> m Vertex
lca :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> m Vertex
lca Lct (PrimState m) a
lct Vertex
u Vertex
v = ST (PrimState m) Vertex -> m Vertex
forall (m :: * -> *) a. PrimMonad m => ST (PrimState m) a -> m a
stToPrim (ST (PrimState m) Vertex -> m Vertex)
-> ST (PrimState m) Vertex -> m Vertex
forall a b. (a -> b) -> a -> b
$ do
Vertex
ru <- Lct (PrimState (ST (PrimState m))) a
-> Vertex -> ST (PrimState m) Vertex
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m Vertex
root Lct (PrimState m) a
Lct (PrimState (ST (PrimState m))) a
lct Vertex
u
Vertex
rv <- Lct (PrimState (ST (PrimState m))) a
-> Vertex -> ST (PrimState m) Vertex
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> m Vertex
root Lct (PrimState m) a
Lct (PrimState (ST (PrimState m))) a
lct Vertex
v
let !()
_ = HasCallStack => Bool -> String -> ()
Bool -> String -> ()
ACIA.runtimeAssert (Vertex
ru Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
rv) (String -> ()) -> String -> ()
forall a b. (a -> b) -> a -> b
$ String
"AtCoder.Extra.Lct.lca: given two vertices in different connected components " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Vertex, Vertex) -> String
forall a. Show a => a -> String
show (Vertex
u, Vertex
v)
Vertex
_ <- Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
u
Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
v
{-# INLINE prodPath #-}
prodPath :: (HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) => Lct (PrimState m) a -> Vertex -> Vertex -> m a
prodPath :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> m a
prodPath lct :: Lct (PrimState m) a
lct@Lct {MVector (PrimState m) a
prodLct :: forall s a. Lct s a -> MVector s a
prodLct :: MVector (PrimState m) a
prodLct} Vertex
u Vertex
v = 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
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct (PrimState m) a
lct Vertex
u
Vertex
_ <- Lct (PrimState m) a -> Vertex -> ST (PrimState m) Vertex
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s Vertex
exposeST Lct (PrimState m) a
lct Vertex
v
MVector (PrimState (ST (PrimState m))) a
-> Vertex -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
prodLct Vertex
v
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.prodPath" Vertex
u (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.prodPath" Vertex
v (Lct (PrimState m) a -> Vertex
forall s a. Lct s a -> Vertex
nLct Lct (PrimState m) a
lct)
{-# INLINE prodSubtree #-}
prodSubtree ::
(HasCallStack, PrimMonad m, Monoid a, VU.Unbox a) =>
Lct (PrimState m) a ->
Vertex ->
Vertex ->
m a
prodSubtree :: forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Lct (PrimState m) a -> Vertex -> Vertex -> m a
prodSubtree lct :: Lct (PrimState m) a
lct@Lct {Vertex
nLct :: forall s a. Lct s a -> Vertex
nLct :: Vertex
nLct, MVector (PrimState m) a
subtreeProdLct :: forall s a. Lct s a -> MVector s a
subtreeProdLct :: MVector (PrimState m) a
subtreeProdLct} Vertex
v Vertex
rootOrParent = 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
if Vertex
v Vertex -> Vertex -> Bool
forall a. Eq a => a -> a -> Bool
== Vertex
rootOrParent
then do
Lct (PrimState m) a -> Vertex -> ST (PrimState m) ()
forall a s. (Monoid a, Unbox a) => Lct s a -> Vertex -> ST s ()
evertST Lct (PrimState m) a
lct Vertex
v
MVector (PrimState (ST (PrimState m))) a
-> Vertex -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
subtreeProdLct Vertex
v
else do
Vertex
parent_ <- Lct (PrimState m) a
-> Vertex -> Vertex -> Vertex -> ST (PrimState m) Vertex
forall a s.
(HasCallStack, Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> Vertex -> ST s Vertex
jumpST Lct (PrimState m) a
lct Vertex
v Vertex
rootOrParent Vertex
1
Lct (PrimState m) a -> Vertex -> Vertex -> ST (PrimState m) ()
forall a s.
(Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
cutST Lct (PrimState m) a
lct Vertex
v Vertex
parent_
a
res <- MVector (PrimState (ST (PrimState m))) a
-> Vertex -> ST (PrimState m) a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Vertex -> m a
VGM.unsafeRead MVector (PrimState m) a
MVector (PrimState (ST (PrimState m))) a
subtreeProdLct Vertex
v
Lct (PrimState m) a -> Vertex -> Vertex -> ST (PrimState m) ()
forall a s.
(Monoid a, Unbox a) =>
Lct s a -> Vertex -> Vertex -> ST s ()
linkST Lct (PrimState m) a
lct Vertex
v Vertex
parent_
a -> ST (PrimState m) a
forall a. a -> ST (PrimState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
res
where
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.prodSubtree" Vertex
v Vertex
nLct
!()
_ = HasCallStack => String -> Vertex -> Vertex -> ()
String -> Vertex -> Vertex -> ()
ACIA.checkIndex String
"AtCoder.Extra.Lct.prodSubtree" Vertex
rootOrParent Vertex
nLct