template <classT> inlinevoidchmin(T &x, const T &y){ if (x > y) { x = y; } } template <classT> inlinevoidchmax(T &x, const T &y){ if (x < y) { x = y; } }
constint N = 510;
int n, B;
int times;
intpush(int x){ assert(++ times <= 35000); std::cout << "+ " << x << std::endl; int res; std::cin >> res; return res; } intpop(){ assert(++ times <= 35000); std::cout << "-" << std::endl; int res; std::cin >> res; return res; }
std::vector<int> key0;
std::vector<int> hold[N];
voidsolve(int l, int r, std::vector<int> key){ if (l == r) { assert(key.size() == 1); hold[key[0]].push_back(l); return; } int mid = (l + r) >> 1;
std::vector<int> lkey, rkey; { int lst = 0; for (int x : key) { lst = push(x); } for (int i = l; i <= mid; i ++) { lst = push(i); }
for (int x : key) { int net = pop(); if (net == lst) { lkey.push_back(x); } lst = net; } for (int i = l; i <= mid; i ++) { pop(); } } { int lst = 0; for (int x : key) { lst = push(x); } for (int i = mid + 1; i <= r; i ++) { lst = push(i); }
for (int x : key) { int net = pop(); if (net == lst) { rkey.push_back(x); } lst = net; } for (int i = mid + 1; i <= r; i ++) { pop(); } }
{ int lst = 0; for (int i = 1; i <= n; i ++) { int net = push(i); if (net == lst + 1) { key0.push_back(i); lst = net; } } for (int i = 1; i <= n; i ++) { pop(); } }
solve(1, n, key0);
int anslen = 0; for (int i = 1; i <= n; i ++) { if (hold[i].size()) { anslen ++; } } std::cout << "! " << anslen << std::endl; for (int i = 1; i <= n; i ++) { if (hold[i].size()) { std::cout << hold[i].size() << ' '; for (int x : hold[i]) { std::cout << x << ' '; } std::cout << std::endl; } }