/* -*- coding: utf-8 -*- * * 3590.cc: No.3590 I Love Inversions - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 50000 + 1; /* typedef */ template struct BIT { int n; vector bits; BIT() {} BIT(int _n) { init(_n); } void init(int _n) { n = _n; bits.assign(n + 1, 0); } T sum(int x) { x = min(x, n); T s = 0; while (x > 0) { s += bits[x]; x -= (x & -x); } return s; } void add(int x, T v) { if (x <= 0) return; while (x <= n) { bits[x] += v; x += (x & -x); } } }; /* global variables */ int xs[MAX_N], ds[MAX_N], ps[MAX_N]; BIT bit; /* subroutines */ int query(int i, int j) { printf("? %d %d\n", i, j); fflush(stdout); int r; scanf("%d", &r); if (r < 0) exit(0); return r; } int binsearch(int n, int k) { int p0 = 0, p1 = n; while (p0 + 1 < p1) { int p = (p0 + p1) / 2; if (bit.sum(p) >= k) p1 = p; else p0 = p; } return p1; } /* main */ int main() { int n; scanf("%d", &n); for (int i = 2; i <= n; i++) { xs[i] = query(1, i); ds[i] = xs[i] - xs[i - 1]; } bit.init(n); for (int i = 1; i <= n; i++) bit.add(i, 1); for (int i = n; i >= 1; i--) { ps[i] = binsearch(n, i - ds[i]); bit.add(ps[i], -1); } putchar('!'); for (int i = 1; i <= n; i++) printf(" %d", ps[i]); putchar('\n'); fflush(stdout); return 0; }