fn main() { let mut cnt = 0; let mut query = |x: i32| -> i32 { assert!(cnt < 25); cnt += 1; println!("? {x}"); if cnt > 1 { let v = read(); assert!(v != -1); v } else { 0 } }; let mut l = 1; let mut r = 1000000; query(l); let mut op = 0; while l < r { let res = if op == 0 { query(r) } else { query(l) }; match (op, res) { (0, 0) => { let m = (l + r) / 2; r = m; }, (0, 1) => { let m = (l + r + 1) / 2; l = m; op = 1; }, (1, 0) => { let m = (l + r + 1) / 2; l = m; }, (1, 1) => { let m = (l + r) / 2; r = m; op = 0; } _ => unreachable!(), }; } println!("! {}", l); } fn read() -> i32 { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); s.trim().parse().unwrap() }