diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,3 +11,7 @@
 ## 0.1.1.0 -- 2020-12-18
 
 * First version revised B. Fixed issue with the first and last elements of the array that were not taken into account.
+
+## 0.1.2.0 -- 2021-03-28
+
+* First version revised C. Some code optimization improvements. Changed the inner implementation and imported modules.
diff --git a/CaseBi/Arr.hs b/CaseBi/Arr.hs
--- a/CaseBi/Arr.hs
+++ b/CaseBi/Arr.hs
@@ -1,10 +1,12 @@
 {-# OPTIONS_HADDOCK show-extensions #-}
+{-# OPTIONS_GHC -funbox-strict-fields #-}
 {-# LANGUAGE UnboxedTuples #-}
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MagicHash #-}
 
 -- | Module    :  CaseBi.Arr
--- Copyright   :  (c) OleksandrZhabenko 2020
+-- Copyright   :  (c) OleksandrZhabenko 2020-2021
 -- License     :  MIT
 -- Stability   :  Experimental
 -- Maintainer  :  olexandr543@yahoo.com
@@ -30,6 +32,7 @@
 
 import qualified Data.List as L (sortBy)
 import GHC.Arr
+import GHC.Exts
 import Data.Ord (comparing)
 
 {- | The function that can be used instead of the 'case ... of' function
@@ -55,22 +58,24 @@
   -> b -- ^ The default value that is used if no first element in the array tuples equals to the compared value.
   -> a -- ^ The compared value, well, the @main@ function argument, to which it is applied.
   -> b -- ^ The resulting branch value.
-getBFst'' (# i, k #) (# j, m #) arr def x
+getBFst'' (# (I# i#), k #) (# (I# j#), m #) arr def x
  | if x < fst k then True else x > fst m = def
- | otherwise = gBF3 (# i, k #) (# j, m #) arr def x
+ | otherwise = gBF3 (# i#, k #) (# j#, m #) arr def x
 {-# INLINE getBFst'' #-}
 
--- | The meaning of the arguments is the same as for 'getBFst'''. Is used internally in it.
-gBF3 :: Ord a => (# Int, (a, b) #) -> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
-gBF3 (# i, k #) (# j, m #) arr def x
- | j - i > 1 = let !n = (i + j) `quot` 2 in let !p = unsafeAt arr n in
+-- | The meaning of the arguments is the same as for 'getBFst'''. Is used internally in it. 
+gBF3 :: Ord a => (# Int#, (a, b) #) -> (# Int#, (a, b) #) -> Array i (a, b) -> b -> a -> b
+gBF3 (# !i#, k #) (# !j#, m #) arr def x
+ | isTrue# ((j# -# i#) ># 1# ) = 
     case compare x (fst p) of
-     GT -> gBF3 (# n, p #) (# j, m #) arr def x
-     EQ -> snd p
-     _  -> gBF3 (# i, k #) (# n, p #) arr def x
+     GT -> gBF3 (# n#, p #) (# j#, m #) arr def x
+     LT  -> gBF3 (# i#, k #) (# n#, p #) arr def x
+     _ -> snd p
  | x == fst m = snd m
  | x == fst k = snd k
  | otherwise = def
+     where !n# = (i# +# j#) `quotInt#` 2#
+           !p = unsafeAt arr (I# n#)
 {-# INLINABLE gBF3 #-}
 
 -- | A generally written without extending variant of the 'getBFst'''.
diff --git a/mmsyn2-array.cabal b/mmsyn2-array.cabal
--- a/mmsyn2-array.cabal
+++ b/mmsyn2-array.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                mmsyn2-array
-version:             0.1.1.0
+version:             0.1.2.0
 synopsis:            A library with less dependencies that can be used for multiple Ord a => a -> b transformations.
 description:         A library that can be used as a @case ... of@ constuction analogue for the multiple @Ord a => a -> b@ transformations and data representation. Uses "GHC.Arr" internally. If you use the module in GHCi, then, please, run the interpreter with the flag -fobject-code.
 homepage:            https://hackage.haskell.org/package/mmsyn2-array
@@ -19,7 +19,8 @@
 library
   exposed-modules:     CaseBi.Arr
   -- other-modules:
-  other-extensions:    UnboxedTuples, BangPatterns, FlexibleContexts
+  other-extensions:    UnboxedTuples, BangPatterns, FlexibleContexts, MagicHash
+  ghc-options:         -funbox-strict-fields
   build-depends:       base >=4.7 && <4.15
   -- hs-source-dirs:
   default-language:    Haskell2010
