#include using namespace std; struct node { int s, t; }; int n, pre[505], nxt[505]; bool query(int x, int y) { cout << "? " << x << ' ' << y << endl, cin >> x; return x; } node f(int l, int r) { if(l == r) return {l, l}; int mid = l + r >> 1; auto x = f(l, mid), y = f(mid + 1, r); vector a, b; for(int i = x.s; i; i = nxt[i]) a.push_back(i); for(int i = y.s; i; i = nxt[i]) b.push_back(i); for(; a.size() && b.size();) if(a.size() && (!b.size() || query(b.back(), a.back()))) pre[nxt[a.back()] = nxt[b.back()]] = a.back(), pre[nxt[b.back()] = a.back()] = b.back(), a.pop_back(); else pre[nxt[b.back()] = nxt[a.back()]] = b.back(), pre[nxt[a.back()] = b.back()] = a.back(), b.pop_back(); return {pre[y.s] ? x.s : y.s, nxt[y.t] ? x.t : y.t}; } int main() { cin >> n; auto res = f(1, n); cout << '!' << endl << n - 1 << endl; for(int i = res.s; i; i = nxt[i]) cout << i << ' '; return 0; }