{-# LANGUAGE LambdaCase #-} import System.IO main = do x <- binarySearch (flipX ask) (-110) 110 y <- binarySearch (flipY ask) (-110) 110 z <- binarySearch (flipZ ask) (-110) 110 putStrLn $ "! " ++ show x ++ " " ++ show y ++ " " ++ show z flipX f x y z = f x y z flipY f y x z = f x y z flipZ f z x y = f x y z binarySearch :: (Int -> Int -> Int -> IO Int) -> Int -> Int -> IO Int binarySearch f l r | r - l == 1 = return r | otherwise = do let mid = (l + r) `div` 2 (<) <$> f mid 0 0 <*> f (mid + 1) 0 0 >>= \case True -> binarySearch f l mid False -> binarySearch f mid r ask :: Int -> Int -> Int -> IO Int ask x y z = do putStrLn $ "? " ++ show x ++ " " ++ show y ++ " " ++ show z hFlush stdout readLn