#include #include #include #include using namespace std; int main() { int n; cin >> n; vector cnt(n); for (int i = 0; i < n; ++i) { int now = 1; while (now < n) { cout << "? " << now; for (int j = 0; j < now; ++j) cout << ' ' << i + 1; cout << endl; string s; cin >> s; if (s == "No") { cnt[i] = now - 1; break; } ++now; if (now == n) { cnt[i] = n; break; } } } set>> st; for (int i = 0; i < n; ++i) { if (cnt[i]) { vector tmp(cnt[i], i + 1); st.insert({cnt[i], tmp}); } } auto cal = [&](vector &a, vector &b) -> vector { int s1 = a.size(), s2 = b.size(); int pos = 0, ca = 0; vector ret; for (int i = 0; i < s2; ++i) { while (ca < s1) { cout << "? " << s2 + ca + 1; for (auto v : ret) cout << ' ' << v; cout << ' ' << a[ca]; for (int j = i; j < s2; ++j) cout << " " << b[j]; cout << endl; string s; cin >> s; if (s == "No") break; ret.push_back(a[ca]); ++ca; } ret.push_back(b[i]); } while (ca < s1) { ret.push_back(a[ca]); ++ca; } return ret; }; while (st.size() >= 2) { auto itr1 = st.begin(); auto [l1, v1] = *itr1; st.erase(itr1); auto itr2 = st.begin(); auto [l2, v2] = *itr2; st.erase(itr2); vector nxt = cal(v1, v2); st.insert({nxt.size(), nxt}); } vector ans = st.begin()->second; cout << "!"; for (int i = 0; i < n; ++i) cout << ' ' << ans[i]; cout << endl; }