#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DEBUG_OUTPUT_ENABLED 1
	#define DBG(X) dout << #X << "=" << (X) << '\n';
	#define SAY(X) dout << (X) << '\n';
#else
	#define DEBUG_OUTPUT_ENABLED 0
	#define DBG(X) 42;
	#define SAY(X) 42;
#endif

#define dout   ___debug::instance

using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const set<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const map<T, S>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const multiset<T>& v) { for(auto el: v) cout << el << " "; return os; }
namespace ___debug {
	struct DebugStream {
		private:
			bool is_first;
		public:
			DebugStream(bool _is_first): is_first(_is_first) {}
			template<typename T> DebugStream operator<<(const T& value) const {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				cout << value;
				return DebugStream(false);
			};

			template<typename T> DebugStream printArray(T* l, T* r) {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				while(l != r) {
					cout << (*l);
					++l;
					if(l == r) {
						cout << '\n';
					} else {
						cout << ' ';
					}
				}
				return DebugStream(false);
			}
	};
	DebugStream instance(true);
};

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }
namespace I {
	namespace {
		const vector<int> SECRET = {-1, 1, -1, 1, -1, -1, 1, 1, -1, 1};
		int n;
	}
	void init() {
		dout << "@SEC:" << SECRET << '\n';
		n = len(SECRET);
		assert(n % 4 == 2);
	}
	int GetN() {
		return n;
	}
	int Ask(const vector<int>& idx) {
		assert(len(idx) == n / 2);
		int sum = 0;
		for(int p = 0; p < len(idx); ++p) for(int q = 0; q < p; ++q) assert(idx[p] != idx[q]);
		for(auto& i: idx) {
			assert(0 <= i && i < n);
			sum += SECRET[i];
		}
		return (sum > 0 ? +1 : -1);
	}
	void SubmitAnswer(const vector<int>& answ) {
		assert(len(answ) == n);
		dout << "@ANS:" << answ << '\n';
		if(answ == SECRET) cout << "OK\n";
		else cout << "WA\n";
	}
}
namespace R {
	void init() {
		// nothing
	}
	int GetN() {
		return 2 * fetch<int>();
	}
	int Ask(const vector<int>& idx) {
		cout << '?';
		for(auto& i: idx) cout << ' ' << i + 1;
		cout << '\n';
		flush(cout);
		auto S = fetch<string>();
		return (S[0] == 'R' ? +1 : -1);
	}
	void SubmitAnswer(const vector<int>& answ) {
		cout << "! ";
		for(auto& x: answ) cout << (x > 0 ? 'R' : 'B');
		cout << '\n';
		flush(cout);
	}
};
#ifndef __LOCAL
#define I R
#endif
int n;
int AskSegment(int l, int sz) {
	vector<int> toAsk;
	for(int i = l; i < l + sz; ++i) toAsk.emplace_back(i);
	return I::Ask(toAsk);
}
void solve() {
	I::init();
	n = I::GetN();
	int low = 0, high = n / 2;
	int lowVal = AskSegment(low, n / 2);
	int highVal = AskSegment(high, n / 2);
	assert(lowVal + highVal == 0);
	while(high - low > 1) {
		int mid = (low + high) / 2;
		if(AskSegment(mid, n / 2) == lowVal) {
			low = mid;
		} else {
			high = mid;
		}
	}
	vector<int> answ(n, 0);
	int l = low, r = low + n / 2 - 1;
	for(int i = 0; i < n; ++i) {
		if(l <= i && i <= r) continue;
		vector<int> toAsk;
		for(int j = l + 1; j <= r; ++j) toAsk.emplace_back(j);
		toAsk.emplace_back(i);
		answ[i] = I::Ask(toAsk);
	}
	l += n / 2, r += n / 2;
	for(int i = 0; i < n; ++i) {
		if(answ[i]) continue;
		vector<int> toAsk;
		for(int j = l + 1; j <= r; ++j) toAsk.emplace_back(j % n);
		toAsk.emplace_back(i);
		answ[i] = I::Ask(toAsk);
	}
	I::SubmitAnswer(answ);
}

int main() {
	//fast_io();
	solve();

	return 0;
}


Measured memory_bytes: 724