{-# LANGUAGE RecordWildCards #-}
module AtCoder.Extra.WaveletMatrix2d
(
WaveletMatrix2d (..),
new,
build,
read,
write,
modify,
prod,
prodMaybe,
allProd,
)
where
import AtCoder.Extra.Bisect (bisectR, lowerBound)
import AtCoder.Extra.WaveletMatrix.BitVector qualified as BV
import AtCoder.Extra.WaveletMatrix.Raw qualified as Rwm
import AtCoder.Internal.Assert qualified as ACIA
import AtCoder.SegTree qualified as ST
import Control.Monad.Primitive (PrimMonad, PrimState)
import Data.Bit (Bit (..))
import Data.Bits (Bits (testBit))
import Data.Maybe (fromJust, fromMaybe)
import Data.Vector qualified as V
import Data.Vector.Algorithms.Intro qualified as VAI
import Data.Vector.Generic qualified as VG
import Data.Vector.Unboxed qualified as VU
import GHC.Stack (HasCallStack)
import Prelude hiding (read)
data WaveletMatrix2d s a = WaveletMatrix2d
{
forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
rawWmWm2d :: !Rwm.RawWaveletMatrix,
forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
xyDictWm2d :: !(VU.Vector (Int, Int)),
forall s a. WaveletMatrix2d s a -> Vector Int
yDictWm2d :: !(VU.Vector Int),
forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
segTreesWm2d :: !(V.Vector (ST.SegTree s a)),
forall s a. WaveletMatrix2d s a -> a -> a
invWm2d :: !(a -> a)
}
{-# INLINE new #-}
new ::
(PrimMonad m, Monoid a, VU.Unbox a) =>
(a -> a) ->
VU.Vector (Int, Int) ->
m (WaveletMatrix2d (PrimState m) a)
new :: forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
(a -> a)
-> Vector (Int, Int) -> m (WaveletMatrix2d (PrimState m) a)
new a -> a
invWm2d Vector (Int, Int)
xys = do
let n :: Int
n = Vector (Int, Int) -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector (Int, Int)
xys
let xyDictWm2d :: Vector (Int, Int)
xyDictWm2d = Vector (Int, Int) -> Vector (Int, Int)
forall a. (Unbox a, Eq a) => Vector a -> Vector a
VU.uniq (Vector (Int, Int) -> Vector (Int, Int))
-> (Vector (Int, Int) -> Vector (Int, Int))
-> Vector (Int, Int)
-> Vector (Int, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s. MVector s (Int, Int) -> ST s ())
-> Vector (Int, Int) -> Vector (Int, Int)
forall a.
Unbox a =>
(forall s. MVector s a -> ST s ()) -> Vector a -> Vector a
VU.modify (Comparison (Int, Int)
-> MVector (PrimState (ST s)) (Int, Int) -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m ()
VAI.sortBy Comparison (Int, Int)
forall a. Ord a => a -> a -> Ordering
compare) (Vector (Int, Int) -> Vector (Int, Int))
-> Vector (Int, Int) -> Vector (Int, Int)
forall a b. (a -> b) -> a -> b
$ Vector (Int, Int)
xys
let (!Vector Int
_, !Vector Int
ys) = Vector (Int, Int) -> (Vector Int, Vector Int)
forall a b.
(Unbox a, Unbox b) =>
Vector (a, b) -> (Vector a, Vector b)
VU.unzip Vector (Int, Int)
xys
let yDictWm2d :: Vector Int
yDictWm2d = Vector Int -> Vector Int
forall a. (Unbox a, Eq a) => Vector a -> Vector a
VU.uniq (Vector Int -> Vector Int) -> Vector Int -> Vector Int
forall a b. (a -> b) -> a -> b
$ (forall s. MVector s Int -> ST s ()) -> Vector Int -> Vector Int
forall a.
Unbox a =>
(forall s. MVector s a -> ST s ()) -> Vector a -> Vector a
VU.modify (Comparison Int -> MVector (PrimState (ST s)) Int -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m ()
VAI.sortBy Comparison Int
forall a. Ord a => a -> a -> Ordering
compare) Vector Int
ys
let (!Vector Int
_, !Vector Int
ysInput) = Vector (Int, Int) -> (Vector Int, Vector Int)
forall a b.
(Unbox a, Unbox b) =>
Vector (a, b) -> (Vector a, Vector b)
VU.unzip Vector (Int, Int)
xyDictWm2d
let rawWmWm2d :: RawWaveletMatrix
rawWmWm2d = HasCallStack => Int -> Vector Int -> RawWaveletMatrix
Int -> Vector Int -> RawWaveletMatrix
Rwm.build (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Vector Int -> RawWaveletMatrix) -> Vector Int -> RawWaveletMatrix
forall a b. (a -> b) -> a -> b
$ (Int -> Int) -> Vector Int -> Vector Int
forall a b. (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b
VU.map (Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Int -> Int) -> (Int -> Maybe Int) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Maybe Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a, Ord a) =>
v a -> a -> Maybe Int
lowerBound Vector Int
yDictWm2d) Vector Int
ysInput
Vector (SegTree (PrimState m) a)
segTreesWm2d <- Int
-> m (SegTree (PrimState m) a)
-> m (Vector (SegTree (PrimState m) a))
forall (m :: * -> *) a. Monad m => Int -> m a -> m (Vector a)
V.replicateM (RawWaveletMatrix -> Int
Rwm.heightRwm RawWaveletMatrix
rawWmWm2d) (Int -> m (SegTree (PrimState m) a)
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
Int -> m (SegTree (PrimState m) a)
ST.new Int
n)
WaveletMatrix2d (PrimState m) a
-> m (WaveletMatrix2d (PrimState m) a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
invWm2d :: a -> a
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
rawWmWm2d :: RawWaveletMatrix
segTreesWm2d :: Vector (SegTree (PrimState m) a)
..}
{-# INLINE build #-}
build ::
(PrimMonad m, Monoid a, VU.Unbox a) =>
(a -> a) ->
VU.Vector (Int, Int, a) ->
m (WaveletMatrix2d (PrimState m) a)
build :: forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
(a -> a)
-> Vector (Int, Int, a) -> m (WaveletMatrix2d (PrimState m) a)
build a -> a
invWm2d Vector (Int, Int, a)
xysw = do
let (!Vector Int
xs, !Vector Int
ys, !Vector a
_) = Vector (Int, Int, a) -> (Vector Int, Vector Int, Vector a)
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
Vector (a, b, c) -> (Vector a, Vector b, Vector c)
VU.unzip3 Vector (Int, Int, a)
xysw
WaveletMatrix2d (PrimState m) a
wm <- (a -> a)
-> Vector (Int, Int) -> m (WaveletMatrix2d (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
(a -> a)
-> Vector (Int, Int) -> m (WaveletMatrix2d (PrimState m) a)
new a -> a
invWm2d (Vector (Int, Int) -> m (WaveletMatrix2d (PrimState m) a))
-> Vector (Int, Int) -> m (WaveletMatrix2d (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ Vector Int -> Vector Int -> Vector (Int, Int)
forall a b.
(Unbox a, Unbox b) =>
Vector a -> Vector b -> Vector (a, b)
VU.zip Vector Int
xs Vector Int
ys
Vector (Int, Int, a) -> ((Int, Int, a) -> m ()) -> m ()
forall (m :: * -> *) a b.
(Monad m, Unbox a) =>
Vector a -> (a -> m b) -> m ()
VU.forM_ Vector (Int, Int, a)
xysw (((Int, Int, a) -> m ()) -> m ())
-> ((Int, Int, a) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \(!Int
x, !Int
y, !a
w) -> do
WaveletMatrix2d (PrimState m) a -> (a -> a) -> (Int, Int) -> m ()
forall a (m :: * -> *).
(HasCallStack, Monoid a, Unbox a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> (a -> a) -> (Int, Int) -> m ()
modify WaveletMatrix2d (PrimState m) a
wm (a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
w) (Int
x, Int
y)
WaveletMatrix2d (PrimState m) a
-> m (WaveletMatrix2d (PrimState m) a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure WaveletMatrix2d (PrimState m) a
wm
{-# INLINE read #-}
read :: (HasCallStack, VU.Unbox a, Monoid a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> (Int, Int) -> m a
read :: forall a (m :: * -> *).
(HasCallStack, Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> (Int, Int) -> m a
read WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} (!Int
x, !Int
y) = do
SegTree (PrimState m) a -> Int -> m a
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
SegTree (PrimState m) a -> Int -> m a
ST.read (Vector (SegTree (PrimState m) a) -> SegTree (PrimState m) a
forall a. Vector a -> a
V.head Vector (SegTree (PrimState m) a)
segTreesWm2d) (Int -> m a) -> (Maybe Int -> Int) -> Maybe Int -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Int -> m a) -> Maybe Int -> m a
forall a b. (a -> b) -> a -> b
$ Vector (Int, Int) -> (Int, Int) -> Maybe Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a, Ord a) =>
v a -> a -> Maybe Int
lowerBound Vector (Int, Int)
xyDictWm2d (Int
x, Int
y)
{-# INLINE write #-}
write :: (HasCallStack, Monoid a, VU.Unbox a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> (Int, Int) -> a -> m ()
write :: forall a (m :: * -> *).
(HasCallStack, Monoid a, Unbox a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> (Int, Int) -> a -> m ()
write WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} (!Int
x, !Int
y) a
v = do
let !i_ :: Int
i_ = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ Vector (Int, Int) -> (Int, Int) -> Maybe Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a, Ord a) =>
v a -> a -> Maybe Int
lowerBound Vector (Int, Int)
xyDictWm2d (Int
x, Int
y)
(Int -> Int -> (BitVector, SegTree (PrimState m) a) -> m Int)
-> Int -> Vector (BitVector, SegTree (PrimState m) a) -> m ()
forall (m :: * -> *) a b.
Monad m =>
(a -> Int -> b -> m a) -> a -> Vector b -> m ()
V.ifoldM'_
( \Int
i Int
iRow (!BitVector
bits, !SegTree (PrimState m) a
seg) -> do
let !i0 :: Int
i0 = BitVector -> Int -> Int
BV.rank0 BitVector
bits Int
i
let !i' :: Int
i'
| Bit -> Bool
unBit (Bit -> Bool) -> Bit -> Bool
forall a b. (a -> b) -> a -> b
$ Vector Bit -> Int -> Bit
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex (BitVector -> Vector Bit
BV.bitsBv BitVector
bits) Int
i =
Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ RawWaveletMatrix -> Vector Int
Rwm.nZerosRwm RawWaveletMatrix
rawWmWm2d Vector Int -> Int -> Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
VG.! Int
iRow Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i0
| Bool
otherwise = Int
i0
SegTree (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
SegTree (PrimState m) a -> Int -> a -> m ()
ST.write SegTree (PrimState m) a
seg Int
i' a
v
Int -> m Int
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
i'
)
Int
i_
(Vector (BitVector, SegTree (PrimState m) a) -> m ())
-> Vector (BitVector, SegTree (PrimState m) a) -> m ()
forall a b. (a -> b) -> a -> b
$ Vector BitVector
-> Vector (SegTree (PrimState m) a)
-> Vector (BitVector, SegTree (PrimState m) a)
forall a b. Vector a -> Vector b -> Vector (a, b)
V.zip (RawWaveletMatrix -> Vector BitVector
Rwm.bitsRwm RawWaveletMatrix
rawWmWm2d) Vector (SegTree (PrimState m) a)
segTreesWm2d
{-# INLINE modify #-}
modify :: (HasCallStack, Monoid a, VU.Unbox a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> (a -> a) -> (Int, Int) -> m ()
modify :: forall a (m :: * -> *).
(HasCallStack, Monoid a, Unbox a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> (a -> a) -> (Int, Int) -> m ()
modify WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} a -> a
f (!Int
x, !Int
y) = do
let !i_ :: Int
i_ = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ Vector (Int, Int) -> (Int, Int) -> Maybe Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a, Ord a) =>
v a -> a -> Maybe Int
lowerBound Vector (Int, Int)
xyDictWm2d (Int
x, Int
y)
(Int -> Int -> (BitVector, SegTree (PrimState m) a) -> m Int)
-> Int -> Vector (BitVector, SegTree (PrimState m) a) -> m ()
forall (m :: * -> *) a b.
Monad m =>
(a -> Int -> b -> m a) -> a -> Vector b -> m ()
V.ifoldM'_
( \Int
i Int
iRow (!BitVector
bits, !SegTree (PrimState m) a
seg) -> do
let !i0 :: Int
i0 = BitVector -> Int -> Int
BV.rank0 BitVector
bits Int
i
let !i' :: Int
i'
| Bit -> Bool
unBit (Bit -> Bool) -> Bit -> Bool
forall a b. (a -> b) -> a -> b
$ Vector Bit -> Int -> Bit
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex (BitVector -> Vector Bit
BV.bitsBv BitVector
bits) Int
i =
Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ RawWaveletMatrix -> Vector Int
Rwm.nZerosRwm RawWaveletMatrix
rawWmWm2d Vector Int -> Int -> Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
VG.! Int
iRow Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i0
| Bool
otherwise = Int
i0
SegTree (PrimState m) a -> (a -> a) -> Int -> m ()
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
SegTree (PrimState m) a -> (a -> a) -> Int -> m ()
ST.modify SegTree (PrimState m) a
seg a -> a
f Int
i'
Int -> m Int
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
i'
)
Int
i_
(Vector (BitVector, SegTree (PrimState m) a) -> m ())
-> Vector (BitVector, SegTree (PrimState m) a) -> m ()
forall a b. (a -> b) -> a -> b
$ Vector BitVector
-> Vector (SegTree (PrimState m) a)
-> Vector (BitVector, SegTree (PrimState m) a)
forall a b. Vector a -> Vector b -> Vector (a, b)
V.zip (RawWaveletMatrix -> Vector BitVector
Rwm.bitsRwm RawWaveletMatrix
rawWmWm2d) Vector (SegTree (PrimState m) a)
segTreesWm2d
{-# INLINE prod #-}
prod :: (HasCallStack, VU.Unbox a, Monoid a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
prod :: forall a (m :: * -> *).
(HasCallStack, Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
prod wm :: WaveletMatrix2d (PrimState m) a
wm@WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} !Int
xl !Int
xr !Int
yl !Int
yr
| Int
xl' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
xr' Bool -> Bool -> Bool
|| Int
yl' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
yr' = a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
forall a. Monoid a => a
mempty
| Bool
otherwise = WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
forall a (m :: * -> *).
(Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
unsafeProd WaveletMatrix2d (PrimState m) a
wm Int
xl' Int
xr' Int
yl' Int
yr'
where
(!Vector Int
xDict, !Vector Int
_) = Vector (Int, Int) -> (Vector Int, Vector Int)
forall a b.
(Unbox a, Unbox b) =>
Vector (a, b) -> (Vector a, Vector b)
VU.unzip Vector (Int, Int)
xyDictWm2d
xl' :: Int
xl' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
xl) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
xDict
xr' :: Int
xr' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict) (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
xr) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
xDict
yl' :: Int
yl' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
yl) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
yDictWm2d
yr' :: Int
yr' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d) (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
yr) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
yDictWm2d
!()
_ = HasCallStack => String -> Int -> Int -> Int -> ()
String -> Int -> Int -> Int -> ()
ACIA.checkInterval String
"AtCoder.Extra.WaveletMatrix.SegTree.prod (compressed x)" Int
xl' Int
xr' (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict)
!()
_ = HasCallStack => String -> Int -> Int -> Int -> ()
String -> Int -> Int -> Int -> ()
ACIA.checkInterval String
"AtCoder.Extra.WaveletMatrix.SegTree.prod (compressed y)" Int
yl' Int
yr' (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d)
{-# INLINE prodMaybe #-}
prodMaybe :: (VU.Unbox a, Monoid a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m (Maybe a)
prodMaybe :: forall a (m :: * -> *).
(Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a
-> Int -> Int -> Int -> Int -> m (Maybe a)
prodMaybe wm :: WaveletMatrix2d (PrimState m) a
wm@WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} !Int
xl !Int
xr !Int
yl !Int
yr
| Bool -> Bool
not (Int -> Int -> Int -> Bool
ACIA.testInterval Int
xl' Int
xr' (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict)) = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
| Bool -> Bool
not (Int -> Int -> Int -> Bool
ACIA.testInterval Int
yl' Int
yr' (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d)) = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
| Int
xl' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
xr' Bool -> Bool -> Bool
|| Int
yl' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
yr' = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
forall a. Monoid a => a
mempty
| Bool
otherwise = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
forall a (m :: * -> *).
(Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
unsafeProd WaveletMatrix2d (PrimState m) a
wm Int
xl' Int
xr' Int
yl' Int
yr'
where
(!Vector Int
xDict, !Vector Int
_) = Vector (Int, Int) -> (Vector Int, Vector Int)
forall a b.
(Unbox a, Unbox b) =>
Vector (a, b) -> (Vector a, Vector b)
VU.unzip Vector (Int, Int)
xyDictWm2d
xl' :: Int
xl' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
xl) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
xDict
xr' :: Int
xr' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict) (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
xDict) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
xr) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
xDict
yl' :: Int
yl' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
yl) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
yDictWm2d
yr' :: Int
yr' = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d) (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ HasCallStack => Int -> Int -> (Int -> Bool) -> Maybe Int
Int -> Int -> (Int -> Bool) -> Maybe Int
bisectR Int
0 (Vector Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length Vector Int
yDictWm2d) ((Int -> Bool) -> Maybe Int) -> (Int -> Bool) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
yr) (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex Vector Int
yDictWm2d
{-# INLINE allProd #-}
allProd :: (HasCallStack, VU.Unbox a, Monoid a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> m a
allProd :: forall a (m :: * -> *).
(HasCallStack, Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> m a
allProd WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} = do
SegTree (PrimState m) a -> m a
forall (m :: * -> *) a.
(PrimMonad m, Monoid a, Unbox a) =>
SegTree (PrimState m) a -> m a
ST.allProd (Vector (SegTree (PrimState m) a) -> SegTree (PrimState m) a
forall a. Vector a -> a
V.head Vector (SegTree (PrimState m) a)
segTreesWm2d)
{-# INLINE unsafeProd #-}
unsafeProd :: (VU.Unbox a, Monoid a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
unsafeProd :: forall a (m :: * -> *).
(Unbox a, Monoid a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> Int -> m a
unsafeProd WaveletMatrix2d (PrimState m) a
wm Int
xl' Int
xr' Int
yl' Int
yr' = do
a
sR <- WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> m a
forall a (m :: * -> *).
(Monoid a, Unbox a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> m a
prodLT WaveletMatrix2d (PrimState m) a
wm Int
xl' Int
xr' Int
yr'
a
sL <- WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> m a
forall a (m :: * -> *).
(Monoid a, Unbox a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> m a
prodLT WaveletMatrix2d (PrimState m) a
wm Int
xl' Int
xr' Int
yl'
a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> m a) -> a -> m a
forall a b. (a -> b) -> a -> b
$! a
sR a -> a -> a
forall a. Semigroup a => a -> a -> a
<> WaveletMatrix2d (PrimState m) a -> a -> a
forall s a. WaveletMatrix2d s a -> a -> a
invWm2d WaveletMatrix2d (PrimState m) a
wm a
sL
{-# INLINE prodLT #-}
prodLT :: (Monoid a, VU.Unbox a, PrimMonad m) => WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> m a
prodLT :: forall a (m :: * -> *).
(Monoid a, Unbox a, PrimMonad m) =>
WaveletMatrix2d (PrimState m) a -> Int -> Int -> Int -> m a
prodLT WaveletMatrix2d {Vector Int
Vector (Int, Int)
Vector (SegTree (PrimState m) a)
RawWaveletMatrix
a -> a
rawWmWm2d :: forall s a. WaveletMatrix2d s a -> RawWaveletMatrix
xyDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector (Int, Int)
yDictWm2d :: forall s a. WaveletMatrix2d s a -> Vector Int
segTreesWm2d :: forall s a. WaveletMatrix2d s a -> Vector (SegTree s a)
invWm2d :: forall s a. WaveletMatrix2d s a -> a -> a
rawWmWm2d :: RawWaveletMatrix
xyDictWm2d :: Vector (Int, Int)
yDictWm2d :: Vector Int
segTreesWm2d :: Vector (SegTree (PrimState m) a)
invWm2d :: a -> a
..} !Int
l_ !Int
r_ Int
yUpper = do
(!a
res, !Int
_, !Int
_) <- do
((a, Int, Int)
-> Int -> (BitVector, SegTree (PrimState m) a) -> m (a, Int, Int))
-> (a, Int, Int)
-> Vector (BitVector, SegTree (PrimState m) a)
-> m (a, Int, Int)
forall (m :: * -> *) a b.
Monad m =>
(a -> Int -> b -> m a) -> a -> Vector b -> m a
V.ifoldM'
( \(!a
acc, !Int
l, !Int
r) !Int
iRow (!BitVector
bits, !SegTree (PrimState m) a
seg) -> do
let !l0 :: Int
l0 = BitVector -> Int -> Int
BV.rank0 BitVector
bits Int
l
!r0 :: Int
r0 = BitVector -> Int -> Int
BV.rank0 BitVector
bits Int
r
if Int -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Int
yUpper (RawWaveletMatrix -> Int
Rwm.heightRwm RawWaveletMatrix
rawWmWm2d Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
iRow)
then do
!a
acc' <- (a
acc <>) (a -> a) -> m a -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SegTree (PrimState m) a -> Int -> Int -> m a
forall (m :: * -> *) a.
(HasCallStack, PrimMonad m, Monoid a, Unbox a) =>
SegTree (PrimState m) a -> Int -> Int -> m a
ST.prod SegTree (PrimState m) a
seg Int
l0 Int
r0
let !l' :: Int
l' = Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
+ RawWaveletMatrix -> Vector Int
Rwm.nZerosRwm RawWaveletMatrix
rawWmWm2d Vector Int -> Int -> Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
VG.! Int
iRow Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
l0
let !r' :: Int
r' = Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
+ RawWaveletMatrix -> Vector Int
Rwm.nZerosRwm RawWaveletMatrix
rawWmWm2d Vector Int -> Int -> Int
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
VG.! Int
iRow Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
r0
(a, Int, Int) -> m (a, Int, Int)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
acc', Int
l', Int
r')
else do
(a, Int, Int) -> m (a, Int, Int)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
acc, Int
l0, Int
r0)
)
(a
forall a. Monoid a => a
mempty, Int
l_, Int
r_)
(Vector (BitVector, SegTree (PrimState m) a) -> m (a, Int, Int))
-> Vector (BitVector, SegTree (PrimState m) a) -> m (a, Int, Int)
forall a b. (a -> b) -> a -> b
$ Vector BitVector
-> Vector (SegTree (PrimState m) a)
-> Vector (BitVector, SegTree (PrimState m) a)
forall a b. Vector a -> Vector b -> Vector (a, b)
V.zip (RawWaveletMatrix -> Vector BitVector
Rwm.bitsRwm RawWaveletMatrix
rawWmWm2d) Vector (SegTree (PrimState m) a)
segTreesWm2d
a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
res