#include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < (int)(n); i++) int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int n; cin >> n; set> ans; map, bool> memo; function query = [&](int l1, int r1, int l2, int r2) { if (memo.contains({l1, r1, l2, r2})) { return memo[{l1, r1, l2, r2}]; } cout << "? " << r1 - l1 << " " << r2 - l2 << " "; for (int i = l1; i < r1; i++) cout << i + 1 << " "; for (int i = l2; i < r2; i++) cout << i + 1 << " "; cout << endl; int a; cin >> a; if (a == -1) { assert(false); } if (a == 1) { return memo[{l1, r1, l2, r2}] = true; } else { return memo[{l1, r1, l2, r2}] = false; } }; function rec = [&](int l1, int r1, int l2, int r2) { if (l1 == r1 || l2 == r2) return; if (l1 + 1 == r1 && l2 + 1 == r2) { if (query(l1, r1, l2, r2)) { ans.insert({l1, l2}); }; return; } int c1 = (l1 + r1) / 2; int c2 = (l2 + r2) / 2; rec(l1, c1, c1, r1); rec(l2, c2, c2, r2); if (query(l1, r1, l2, r2)) { rec(l1, c1, l2, c2); rec(l1, c1, c2, r2); rec(c1, r1, l2, c2); rec(c1, r1, c2, r2); } return; }; int c = n / 2; rec(0, c, c, n); cout << "! " << ans.size() << endl; for (auto [u, v] : ans) cout << u + 1 << " " << v + 1 << endl; return 0; }