import Data.Word main :: IO () main = do let ls = [262734068,1284266430,850241238,1854436759,925227574,1072391605, 1593098480,753973039,1320460728,1653753372,1036510631,1372732547, 2027209822,1573664868] print $ map searchX ls searchX :: Word32 -> Word32 searchX x = f 0 maxBound where f l r | r - l > 0 = f l' r' | otherwise = r where (l', r') = case aboutX x m of 0 -> (r , m) 1 -> (l , m) -1 -> (m + 1, r) m = (+) =<< (`div` 2) . (r -) $ l aboutX :: Word32 -> Word32 -> Word32 aboutX x a = case compare a x of EQ -> 0 GT -> 1 LT -> -1