#include using namespace std; bool query(const vector& q) { cout << "? " << q.size() << " "; for(int i = 0; i < q.size(); i++) { cout << q[i] << " \n"[i==q.size()-1]; } cout << flush; string s; cin >> s; return s == "Yes"; } int n; void answer(const vector& ans) { assert(ans.size() == n); cout << "! "; for(int i = 0; i < n; i++) { cout << ans[i] << " \n"[i==n-1]; } cout << flush; } int main() { cin >> n; vector ans; for(int i = 1; i <= n; i++) { vector pos; for(int cnt = 1; cnt <= n; cnt++) { if(!query(vector(cnt, i))) break; // 最後から cnt 個目の i が挿入される場所の二分探索 int ok = 0, ng = ans.size() + 1; while(ng - ok > 1) { int mid = (ok + ng) / 2; vector q; for(int j = 0; j < mid; j++) q.push_back(ans[j]); for(int j = 0; j < cnt; j++) q.push_back(i); if(query(q)) ok = mid; else ng = mid; } pos.push_back(ok); } for(auto p: pos) { ans.insert(ans.begin() + p, i); } } answer(ans); }