fn main() { let (mut xl, mut yl, mut zl) = (-100, -100, -100); let (mut xr, mut yr, mut zr) = (100, 100, 100); let dl = {println!("? {} {} {}", xl, 0, 0); get::val::()}; let dr = {println!("? {} {} {}", xr, 0, 0); get::val::()}; loop { let x1 = xl + (xr - xl) / 3; let x2 = xr - (xr - xl) / 3; let d1 = {println!("? {} {} {}", x1, 0, 0); get::val::()}; let d2 = {println!("? {} {} {}", x2, 0, 0); get::val::()}; match 0 { _ if dl {xr = x1}, _ if dl>d1 && d1 {xr = x2}, _ if d1>d2 && d2 {xl = x1}, _ => {xl = x2} } if xr - xl == 2 {break} } let d1 = {println!("? {} {} {}", xl, 0, 0); get::val::()}; let d2 = {println!("? {} {} {}", (xl+xr)/2, 0, 0); get::val::()}; let d3 = {println!("? {} {} {}", xr, 0, 0); get::val::()}; let x = match 0 { _ if d1 {xl}, _ if d3 {xr}, _ => {(xl+xr)/2} }; let dl = {println!("? {} {} {}", 0, yl, 0); get::val::()}; let dr = {println!("? {} {} {}", 0, yr, 0); get::val::()}; loop { let y1 = yl + (yr - yl) / 3; let y2 = yr - (yr - yl) / 3; let d1 = {println!("? {} {} {}", 0, y1, 0); get::val::()}; let d2 = {println!("? {} {} {}", 0, y2, 0); get::val::()}; match 0 { _ if dl {yr = y1}, _ if dl>d1 && d1 {yr = y2}, _ if d1>d2 && d2 {yl = y1}, _ => {yl = y2} } if yr - yl == 2 {break} } let d1 = {println!("? {} {} {}", 0, yl, 0); get::val::()}; let d2 = {println!("? {} {} {}", 0, (yl+yr)/2, 0); get::val::()}; let d3 = {println!("? {} {} {}", 0, yr, 0); get::val::()}; let y = match 0 { _ if d1 {yl}, _ if d3 {yr}, _ => {(yl+yr)/2} }; let dl = {println!("? {} {} {}", 0, 0, zl); get::val::()}; let dr = {println!("? {} {} {}", 0, 0, zr); get::val::()}; loop { let z1 = zl + (zr - zl) / 3; let z2 = zr - (zr - zl) / 3; let d1 = {println!("? {} {} {}", 0, 0, z1); get::val::()}; let d2 = {println!("? {} {} {}", 0, 0, z2); get::val::()}; match 0 { _ if dl {zr = z1}, _ if dl>d1 && d1 {zr = z2}, _ if d1>d2 && d2 {zl = z1}, _ => {zl = z2} } if zr - zl == 2 {break} } let d1 = {println!("? {} {} {}", 0, 0, zl); get::val::()}; let d2 = {println!("? {} {} {}", 0, 0, (zl+zr)/2); get::val::()}; let d3 = {println!("? {} {} {}", 0, 0, zr); get::val::()}; let z = match 0 { _ if d1 {zl}, _ if d3 {zr}, _ => {(zl+zr)/2} }; println!("! {} {} {}", x, y, z); } #[allow(dead_code)] mod get { use std::io::*; use std::str::*; pub fn val() -> T { let mut buf = String::new(); let s = stdin(); s.lock().read_line(&mut buf).ok(); buf.trim_right().parse::().ok().unwrap() } pub fn vals(n: usize) -> Vec { let mut vec: Vec = vec![]; for _ in 0 .. n { vec.push(val()); } vec } pub fn tuple() -> (T1, T2) { let mut buf = String::new(); let s = stdin(); s.lock().read_line(&mut buf).ok(); let mut it = buf.trim_right().split_whitespace(); let x = it.next().unwrap().parse::().ok().unwrap(); let y = it.next().unwrap().parse::().ok().unwrap(); (x, y) } pub fn tuples(n: usize) -> Vec<(T1, T2)> { let mut vec: Vec<(T1, T2)> = vec![]; for _ in 0 .. n { vec.push(tuple()); } vec } pub fn tuple3() -> (T1, T2, T3) { let mut buf = String::new(); let s = stdin(); s.lock().read_line(&mut buf).ok(); let mut it = buf.trim_right().split_whitespace(); let x = it.next().unwrap().parse::().ok().unwrap(); let y = it.next().unwrap().parse::().ok().unwrap(); let z = it.next().unwrap().parse::().ok().unwrap(); (x, y, z) } pub fn tuple3s(n: usize) -> Vec<(T1, T2, T3)> { let mut vec: Vec<(T1, T2, T3)> = vec![]; for _ in 0 .. n { vec.push(tuple3()); } vec } pub fn list() -> Vec { let mut buf = String::new(); let s = stdin(); s.lock().read_line(&mut buf).ok(); buf.trim_right().split_whitespace().map(|t| t.parse::().ok().unwrap()).collect() } pub fn lists(h: usize) -> Vec> { let mut mat: Vec> = vec![]; for _ in 0 .. h { mat.push(list()); } mat } pub fn chars() -> Vec { let mut buf = String::new(); let s = stdin(); s.lock().read_line(&mut buf).ok(); buf.trim_right().chars().collect() } }