use proconio::{input, source::line::LineSource}; use std::{ collections::BTreeSet, io::{stdin, stdout, BufReader, Write}, }; fn main() { let stdin = stdin(); let mut source = LineSource::new(BufReader::new(stdin.lock())); input! { from &mut source, h: usize, w: usize, } println!("? {} {}", 1, 1); stdout().flush().unwrap(); input! { from &mut source, d: usize, } let rows = (0..h).map(|i| i * i).collect::>(); let cols = (0..w).map(|i| i * i).collect::>(); for &row in &rows { if row > d { break; } let col = *cols.range(..=d - row).next_back().unwrap(); if row + col != d { continue; } let row_i = (row as f64).sqrt() as usize; let col_i = (col as f64).sqrt() as usize; println!("? {} {}", row_i + 1, col_i + 1); stdout().flush().unwrap(); input! { from &mut source, d: usize, } if d == 0 { println!("! {} {}", row_i + 1, col_i + 1); return; } } }