#define _CRT_SECURE_NO_WARNINGS
#pragma comment(linker, "/STACK:256000000")
#include<iostream>
#include<fstream>
#include<cmath>
#include<ctime>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<unordered_map>
#include<unordered_set>

using namespace std;

typedef long long ll;
#define forn(i, n) for (int i = 0; i < n; ++i)
#define forq(i, q, n) for (int i = q; i < n; ++i)
#define mk make_pair
#define psh push_back
#define vi vector<int>
#define vll vector<ll>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define vii vector<pii>
#define vpll vector<pll>
#define x first
#define y second

const int MOD = 1e9 + 7;
const int MAXN = 1e3 + 7;
const ll INf = 1e15 + 7;

int a[MAXN];
int n;

void solve(int c, int k, int tl, int tr)
{
	if (tr - tl == 0)
	{
		a[tl] = c;
		return;
	}
	if (tr - tl == 1)
	{
		if (k == 1)
			a[tl] = a[tr] = c;
		else
		{
			a[tl] = c;
			a[tr] = c + 1;
		}
		return;
	}
	else
	{
		int tm = (tl + tr) / 2;
		int ansl, ansr;
		cout << "? " << tl << " " << tm << endl;
		cin >> ansl;
		cout << "? " << tm + 1 << " " << tr << endl;
		cin >> ansr;
		solve(c, ansl, tl, tm);
		solve(c + ansl - (ansl + ansr - k), ansr, tm + 1, tr);
	}

}

int main()
{
	/*freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);*/
	/*freopen("twopaths.in", "r", stdin);
	freopen("twopaths.out", "w", stdout);*/
	cin >> n;
	cout << "? " << "1 " << n << endl;
	int ans;
	cin >> ans;
	solve(1, ans, 1, n);
	forn(i, n - 2)
	{
		cout << "? " << i << " " << i + 1 << endl;
		int ans;
		cin >> ans;
		if (ans == 2 && a[i] == a[i + 1])
			swap(a[i + 1], a[i + 2]);
	}
	cout << "Ready!\n" << ans << "\n";
	forq(i, 1, n + 1)
		cout << a[i] << " ";
	//while (1);
	return 0;
}