#include using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; int query = 0; auto ask = [&](const vector &B) -> bool { query++; cout << "? " << B.size(); for(auto b : B){ assert(0 <= b && b < N); cout << " " << b+1; } cout << endl; string s; cin >> s; return s=="Yes"; }; auto ans = [&](const vector &A) -> void { cout << "!"; for(auto a : A){ assert(0 <= a && a < N); cout << " " << a+1; } cout << endl; if(query > 5000){ cout << query << endl; assert(false); } exit(0); }; priority_queue>,vector>>,greater<>> Q; for(int i=0; i now; while(true){ now.push_back(i); if(ask(now)) continue; else{now.pop_back(); break;} } Q.push({now.size(),now}); } while(Q.size() > 1){ auto [ign,B1] = Q.top(); Q.pop(); auto [IGN,B2] = Q.top(); Q.pop(); vector now; while(B1.size() && B2.size()){ now.push_back(B2.at(0)); for(auto b : B1) now.push_back(b); bool v = ask(now); for(auto b : B1) now.pop_back(); if(v == false) now.pop_back(),now.push_back(B1.at(0)),B1.erase(B1.begin()); else B2.erase(B2.begin()); } while(B1.size()) now.push_back(B1.at(0)),B1.erase(B1.begin()); swap(B1,B2); while(B1.size()) now.push_back(B1.at(0)),B1.erase(B1.begin()); Q.push({now.size(),now}); } { auto [ign,A] = Q.top(); ans(A); } }