#include using namespace std; vector merge_sort(int l, int r) { if (r - l <= 1) return {l}; int m = (l + r) / 2; auto L = merge_sort(l, m); auto R = merge_sort(m, r); vector res; int i = 0, j = 0; while (i < (int)L.size() && j < (int)R.size()) { cout << "? " << L[i] << " " << R[j] << endl; int t; cin >> t; if (t) { res.push_back(L[i]); i++; } else { res.push_back(R[j]); j++; } } while (i < (int)L.size()) { res.push_back(L[i]); i++; } while (j < (int)R.size()) { res.push_back(R[j]); j++; } return res; } int main() { int n; cin >> n; auto path = merge_sort(1, n + 1); cout << "! " << n << endl; for (int i = 0; i < n; i++) { if (i) cout << " "; cout << path[i]; } cout << endl; }