{-# 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