#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); for(int i = x.t, j = y.t; i && j;) if(i && (!j || query(i, j))) nxt[i] = j, j = pre[j], pre[nxt[i]] = i; else nxt[j] = i, i = pre[i], pre[nxt[j]] = j; 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; }