int n; int p[kMaxN], val[kMaxN]; std::mt19937 rnd(std::random_device{}());
intask(int x, int y, int z){ std::cout << "? " << x << ' ' << y << ' ' << z << std::endl; int d; std::cin >> d; return d; }
std::tuple<int, int, int> gettuple(){ int a = rnd() % n + 1, b = rnd() % n + 1, c = rnd() % n + 1; while (a == b || a == c || b == c) a = rnd() % n + 1, b = rnd() % n + 1, c = rnd() % n + 1; return {a, b, c}; }
std::pair<int, int> getpair(){ int a, b, c; for (int c = 1; c <= 420; ++c) { std::tie(a, b, c) = gettuple(); if (ask(a, b, c) <= (n - 4) / 6) return {a, b}; } }
voiddickdreamer(){ std::cin >> n; auto [a, b] = getpair(); for (int i = 1; i <= n; ++i) { val[i] = 0; if (i != a && i != b) val[i] = ask(a, b, i); } int p1 = 0, p2 = 0; p1 = std::max_element(val + 1, val + 1 + n) - val; std::vector<int> vec; for (int i = 1; i <= n; ++i) { if (val[i] == val[p1] - 1) vec.emplace_back(i); } if ((int)vec.size() == 1) { p2 = vec[0]; } else { assert(vec.size() == 2); if (ask(a, p1, vec[0]) < ask(a, p1, vec[1])) p2 = vec[0]; else p2 = vec[1]; } p[p1] = 1, p[p2] = 2; for (int i = 1; i <= n; ++i) if (i != p1 && i != p2) p[i] = ask(i, p1, p2) + 2; if (p[1] > p[2]) { for (int i = 1; i <= n; ++i) p[i] = n - p[i] + 1; } std::cout << "! "; for (int i = 1; i <= n; ++i) std::cout << p[i] << ' '; std::cout << std::endl; std::cin >> n; }