/* -*- coding: utf-8 -*- * * 3347.cc: No.3347 Guess The Array - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 500; const int CNT = 5000; /* typedef */ using vi = vector; /* global variables */ int cs[MAX_N + 1]; /* subroutines */ bool query(vi &v) { printf("? %d", (int)v.size()); for (auto u: v) printf(" %d", u); putchar('\n'); fflush(stdout); char s[8]; scanf("%s", s); return (s[0] == 'Y'); } void answer(vi &as) { printf("!"); for (auto a: as) printf(" %d", a); putchar('\n'); fflush(stdout); } /* main */ int main() { int n; scanf("%d", &n); int csum = 0; for (int i = 1; csum < n && i <= n; i++) { cs[i] = 0; while (cs[i] < n) { vi v(cs[i] + 1, i); if (query(v)) cs[i]++; else break; } csum += cs[i]; } //vi as(n); //for (int i = 1; i <= n; i++) as[i - 1] = cs[i]; //answer(as); vi ss; for (int i = 1; ss.size() < n && i <= n; i++) if (cs[i]) { if (ss.empty()) ss.assign(cs[i], i); else { vi ss0(ss); for (int k = 1; k <= cs[i]; k++) { int p0 = 0, p1 = ss.size() + 1; while (p0 + 1 < p1) { int p = (p0 + p1) / 2; vi v(ss.begin(), ss.begin() + p); for (int j = 0; j < k; j++) v.push_back(i); if (query(v)) p0 = p; else p1 = p; } ss0.insert(ss0.begin() + p0, i); } swap(ss, ss0); } } answer(ss); return 0; }