import std; void main () { int H, W; readln.read(H, W); // 2乗のコストというのが大事で、実は広くてもクエリ3回でできる。 int ask (int i, int j) { writefln("? %s %s", i, j); stdout.flush; int res = readln.chomp.to!int; enforce(0 < res); return res; } void ans (int i, int j) { writefln("! %s %s", i, j); } if (H == 1 && W == 1) { ans(H, W); return; } if (H == 1) { int u = ask(1, 1); if (W == 2) { ans(1, u == 0 ? 1 : 2); return; } int v = ask(1, 2); int w = -(v - u - 1 - 2 * 1) / 2; ans(1, w); return; } if (W == 1) { int u = ask(1, 1); if (H == 2) { ans(u == 0 ? 1 : 2, 1); return; } int v = ask(2, 1); int h = -(v - u - 1 - 2 * 1) / 2; ans(h, 1); return; } int p = ask(1, 1); int q = ask(2, 1); int r = ask(1, 2); int h = -(q - p - 1 - 2 * 1) / 2; int w = -(r - p - 1 - 2 * 1) / 2; ans(h, w); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }