fn main(){ let mut sc = Scanner::new(); let mut left = 0; // le let mut right = 1_000_000_010; while left + 1 < right { let mid = (left + right) / 2; println!("? {}", mid); use std::io::Write; std::io::stdout().flush().unwrap(); if sc.next::() == 1 { left = mid; } else { right = mid; } } println!("! {}", left); use std::io::Write; std::io::stdout().flush().unwrap(); } #[allow(dead_code)] struct Scanner { buf: Vec, idx: usize, next: String, } #[allow(dead_code)] impl Scanner { fn new() -> Scanner { Scanner { buf: vec![], idx: 0, next: String::new() } } fn next(&mut self) -> T { self.wrapped::().unwrap() } fn vec(&mut self, n: usize) -> Vec { let mut res = Vec::::with_capacity(n); for _ in 0..n { res.push(self.next()) } res } fn wrapped(&mut self) -> Option { if !self.read() { None } else { let res = self.next.parse::().ok(); self.next.clear(); res } } fn read(&mut self) -> bool { if !self.next.is_empty() { true } else { self.next.clear(); loop { match self.get_char() { Some(c) if !c.is_whitespace() => { self.next.push(c); break; }, Some(_) => continue, None => return false, } } loop { match self.get_char() { Some(c) if !c.is_whitespace() => self.next.push(c), _ => return true, } } } } fn get_char(&mut self) -> Option { if self.idx >= self.buf.len() { self.fill_buf(); if self.idx >= self.buf.len() { return None } } self.idx += 1; Some(self.buf[self.idx - 1] as char) } fn fill_buf(&mut self){ use std::io::BufRead; let reader = std::io::stdin(); let mut buffer = reader.lock(); let len = match buffer.fill_buf() { Ok(bytes) => { self.buf.resize(bytes.len(), b'\0'); self.buf.copy_from_slice(bytes); bytes.len() as i32 }, Err(_) => -1, }; self.idx = 0; if len >= 0 { buffer.consume(len as usize); } } }