#line 2 "library/template/template.hpp" #include using namespace std; #line 2 "library/template/macro.hpp" #define rep(i, a, b) for (int i = (a); i < (int)(b); i++) #define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (a); i--) #define ALL(v) (v).begin(), (v).end() #define UNIQUE(v) sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end()) #define SZ(v) (int)v.size() #define MIN(v) *min_element(ALL(v)) #define MAX(v) *max_element(ALL(v)) #define LB(v, x) int(lower_bound(ALL(v), (x)) - (v).begin()) #define UB(v, x) int(upper_bound(ALL(v), (x)) - (v).begin()) #define YN(b) cout << ((b) ? "YES" : "NO") << "\n"; #define Yn(b) cout << ((b) ? "Yes" : "No") << "\n"; #define yn(b) cout << ((b) ? "yes" : "no") << "\n"; #line 6 "library/template/template.hpp" #line 2 "library/template/util.hpp" using uint = unsigned int; using ll = long long int; using ull = unsigned long long; using i128 = __int128_t; using u128 = __uint128_t; template S SUM(const vector& a) { return accumulate(ALL(a), S(0)); } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } template inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } template int popcnt(T x) { return __builtin_popcountll(x); } template int topbit(T x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } template int lowbit(T x) { return (x == 0 ? -1 : __builtin_ctzll(x)); } #line 8 "library/template/template.hpp" #line 2 "library/template/inout.hpp" struct Fast { Fast() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); } } fast; template istream& operator>>(istream& is, pair& p) { return is >> p.first >> p.second; } template ostream& operator<<(ostream& os, const pair& p) { return os << p.first << " " << p.second; } template istream& operator>>(istream& is, vector& a) { for (auto& v : a) is >> v; return is; } template ostream& operator<<(ostream& os, const vector& a) { for (auto it = a.begin(); it != a.end();) { os << *it; if (++it != a.end()) os << " "; } return os; } template ostream& operator<<(ostream& os, const set& st) { os << "{"; for (auto it = st.begin(); it != st.end();) { os << *it; if (++it != st.end()) os << ","; } os << "}"; return os; } template ostream& operator<<(ostream& os, const map& mp) { os << "{"; for (auto it = mp.begin(); it != mp.end();) { os << it->first << ":" << it->second; if (++it != mp.end()) os << ","; } os << "}"; return os; } void in() {} template void in(T& t, U&... u) { cin >> t; in(u...); } void out() { cout << "\n"; } template void out(const T& t, const U&... u) { cout << t; if (sizeof...(u)) cout << sep; out(u...); } #line 10 "library/template/template.hpp" #line 2 "library/template/debug.hpp" #ifdef LOCAL #define debug 1 #define show(...) _show(0, #__VA_ARGS__, __VA_ARGS__) #else #define debug 0 #define show(...) true #endif template void _show(int i, T name) { cerr << '\n'; } template void _show(int i, const T1& a, const T2& b, const T3&... c) { for (; a[i] != ',' && a[i] != '\0'; i++) cerr << a[i]; cerr << ":" << b << " "; _show(i + 1, a, c...); } #line 2 "main.cpp" int n; int q = 0; bool guess(const vector& b) { if (b.empty()) return true; if (b.size() > n) return false; if (++q > 5000) exit(1); cout << "? " << b.size(); for (auto v : b) cout << " " << (v + 1); cout << endl; string s; cin >> s; return s[0] == 'Y'; } void solve() { in(n); vector a; vector z; auto calc = [&](auto calc, int l, int r, int v, int c, int cr) -> void { if (c == 0) return; if (l + 1 == r) { z[l] = c; return; } int m = (l + r) / 2; vector b(a.begin(), a.begin() + m); int ok = 0, ng = c + 1; while (ng - ok > 1) { int mid = (ng + ok) / 2; int cnt = mid + cr; b.insert(b.end(), cnt, v); (guess(b) ? ok : ng) = mid; b.erase(b.end() - cnt, b.end()); } calc(calc, l, m, v, c - ok, ok + cr); calc(calc, m, r, v, ok, cr); }; rep(v, 0, n) { int c = 0; if (v == n - 1) { c = n - a.size(); } else { int k = 0; while (true) { vector b(1 << k, v); if (a.size() + b.size() > n || !guess(b)) { if (k > 0) { k--; c |= 1 << k; rrep(l, 0, k) { b = vector(c + (1 << l), v); if (a.size() + b.size() <= n && guess(b)) c += 1 << l; } } break; } k++; } } z = vector(a.size() + 1); calc(calc, 0, z.size(), v, c, 0); rrep(i, 0, z.size()) if (z[i] > 0) a.insert(a.begin() + i, z[i], v); } cout << "!"; for (auto v : a) cout << " " << (v + 1); cout << endl; } int main() { int t = 1; // in(t); while (t--) solve(); }