#include using namespace std; static const int INF = 1e9 + 7; template using Vec = vector; template using P = pair; template using Tup = tuple; using llong = long long; using ullong = unsigned long long; using uint = unsigned int; map, llong> d; llong ask(short x, short y, short z) { auto status = make_tuple(x, y, z); if (d.count(status)) return d[status]; cout << "? " << x << " " << y << " " << z << endl; int res; cin >> res; return d[status] = res; } void ans(short x, short y, short z) { cout << "! " << x << " " << y << " " << z << endl; } void hawawa() { short xinfo[] = { -100, 100 }; short yinfo[] = { -100, 100 }; short zinfo[] = { -100, 100 }; while (xinfo[0] < xinfo[1] || yinfo[0] < yinfo[1] || zinfo[0] < zinfo[1]) { int mininfo[3]; llong mn = LLONG_MAX; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 2; k++) { if (mn > ask(xinfo[i], yinfo[j], zinfo[k])) { mn = ask(xinfo[i], yinfo[j], zinfo[k]); mininfo[0] = i; mininfo[1] = j; mininfo[2] = k; } } } } if (mininfo[0]) { xinfo[0] = (xinfo[0] + xinfo[1] + 1) / 2; } else { xinfo[1] = (xinfo[0] + xinfo[1]) / 2; } if (mininfo[1]) { yinfo[0] = (yinfo[0] + yinfo[1] + 1) / 2; } else { yinfo[1] = (yinfo[0] + yinfo[1]) / 2; } if (mininfo[2]) { zinfo[0] = (zinfo[0] + zinfo[1] + 1) / 2; } else { zinfo[0] = (zinfo[0] + zinfo[1]) / 2; } } ans(xinfo[0], yinfo[0], zinfo[0]); } int main() { ios::sync_with_stdio(false); cin.tie(0); hawawa(); }