using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static long NN => long.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var x = Calc(0); var y = Calc(1); var z = Calc(2); WriteLine($"! {x} {y} {z}"); } static int Calc(int rotate) { var dp = Enumerable.Repeat(-1L, 301).ToArray(); var offset = 150; dp[0] = Que(-150, 0, 0, rotate); dp[1] = Que(-149, 0, 0, rotate); if (dp[0] < dp[1]) return -150; dp[300] = Que(150, 0, 0, rotate); dp[299] = Que(149, 0, 0, rotate); if (dp[300] < dp[299]) return 150; var left = -150; var right = 150; while (true) { var mid1 = (left * 2 + right) / 3; var mid2 = (left + right * 2) / 3; if (dp[mid1 + offset] < 0) dp[mid1 + offset] = Que(mid1, 0, 0, rotate); if (dp[mid2 + offset] < 0) dp[mid2 + offset] = Que(mid2, 0, 0, rotate); if (right - left == 2) { if (dp[mid1 + offset] < dp[mid2 + offset]) return mid1; else return mid2; } if (dp[mid1 + offset] < dp[mid2 + offset]) right = mid2; else left = mid1; } } static long Que(int x, int y, int z, int rotate) { if (rotate == 0) WriteLine($"? {x} {y} {z}"); else if (rotate == 1) WriteLine($"? {z} {x} {y}"); else if (rotate == 2) WriteLine($"? {y} {z} {x}"); return NN; } }