#include #include #include #include #include #define rep(E, F) for (E = 0; E < (F); E++) int min(int a, int b) { if (a > b) return b; return a; } int max(int a, int b) { if (a < b) return b; return a; } int get_int(); int get_int() { int r = 0, c = getchar(), s = (c == ' ' ? -1 : 1); if (c < '0' || c > '9') return get_int(); for (; c >= '0' && c <= '9'; c = getchar()) r = r*10 + c - '0'; return s*r; } int main() { srand(time(NULL)); int n = get_int(), i, x, y, z, w, s, t, q = 0; int m = n, a[n], b[n]; rep(i, n) b[i] = -1; rep(i, n) a[i] = i; while (q < 99999 && m) { q++; x = rand()%m, y = rand()%m; if (x == y) y = (y + 1)%m; if (x > y) s = x, x = y, y = s; printf("? %d %d\n", a[x] + 1, a[y] + 1); fflush(stdout); z = get_int(), w = get_int(); if (z == w) { b[a[x]] = b[a[y]] = z; if (y == m - 1) a[x] = a[m - 2]; else { s = a[m - 1], t = a[m - 2]; a[x] = s, a[y] = t; } m -= 2; } } printf("! "); rep(i, n) printf("%d ", b[i]); printf("\n"); fflush(stdout); return 0; }