#include using namespace std; map, int> mp; int cnt = 0; int q(int a, int b, int c) { if (mp.count({a, b, c})) return mp[{a, b, c}]; cnt++; assert(cnt <= 200); cout << "? " << a << " " << b << " " << c << endl; cin >> mp[{a, b, c}]; return mp[{a, b, c}]; } int ask(int a, int b, int c1, int c2, int idx) { int r0, r1; if (idx == 0) { r0 = q(c1, a, b); r1 = q(c2, a, b); } if (idx == 1) { r0 = q(a, c1, b); r1 = q(a, c2, b); } if (idx == 2) { r0 = q(a, b, c1); r1 = q(a, b, c2); } return (r0 <= r1); } int main() { int x = 0, y = 0, z = 0; for (int i = 0; i < 3; i++) { int l = -100, r = 100; while (r - l >= 3) { int l1 = (l * 2 + r) / 3, r1 = (l + r * 2) / 3; int ret; if (i == 0) ret = ask(y, z, l1, r1, i); if (i == 1) ret = ask(x, z, l1, r1, i); if (i == 2) ret = ask(x, y, l1, r1, i); if (ret) r = r1; else l = l1; } while (l < r) { int ret; if (i == 0) ret = ask(y, z, l, r, i); if (i == 1) ret = ask(x, z, l, r, i); if (i == 2) ret = ask(x, y, l, r, i); if (ret) r--; else l++; } if (i == 0) x = l; if (i == 1) y = l; if (i == 2) z = l; } cout << "! " << x << " " << y << " " << z << endl; }