#include // #include // Ctrl + end using namespace std; using str = string; using vs = vector; using ll = long long; using ld = long double; using vll = vector; using vvll = vector>; using vvvll = vector>>; using vvvvll = vector>>>; using vb = vector; using vvb = vector>; using pll = pair; using vpll = vector>; #define REP1(i, n) for (long long i = 0; i < n; i++) #define REP2(i, n, m) for (long long i = n; i < m; i++) #define REP3(i, n, d, m) \ for (long long i = n; (n < m) ? (i < m) : (i > m); i += d) #define OVERLOAD_REP(a, b, c, d, e, ...) e #define REP(...) OVERLOAD_REP(__VA_ARGS__, REP3, REP2, REP1)(__VA_ARGS__) #define REPv(itr, v) for (auto itr = v.begin(); itr != v.end(); itr++) #define REPIN(itr, v) \ for (auto itr = v.begin(); itr != v.end(); itr++) { \ cin >> *itr; \ } #define been(vec) vec.begin(), vec.end() #define LIN \ = []() { \ long long LONGLONG_INPUT; \ cin >> LONGLONG_INPUT; \ return LONGLONG_INPUT; \ }() #define SIN \ = []() { \ string STRING_INPUT; \ cin >> STRING_INPUT; \ return STRING_INPUT; \ }() #define SPNL(i, SIZE) (i + 1 == SIZE ? '\n' : ' ') template constexpr T gcd(const T &x, const T &y) { return (x % y) ? gcd(y, x % y) : y; } template constexpr T gcd(const T &x, const R &...y) { return gcd(x, gcd(y...)); } template constexpr T lcm(const T &x, const T &y) { return x / gcd(x, y) * y; } template constexpr T lcm(const T &x, const R &...y) { return lcm(x, lcm(y...)); } template bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; } template bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; } // 3要素で比較するとfunc(a,b,comp)と勘違いされるから「{...}」使う template constexpr auto min(const T &...a) { return min(initializer_list>{a...}); } template constexpr auto max(const T &...a) { return max(initializer_list>{a...}); } // tuple処理 template void iterate_tuple(T &t, const F &func) { if constexpr (N < tuple_size_v) { auto &x = get(t); func(x); iterate_tuple(t, func); } } // ストリーム演算子 入力 template istream &operator>>(istream &is, pair &p) { is >> p.first >> p.second; return is; } template istream &operator>>(istream &is, tuple &t) { auto func = [&is](auto &t) { is >> t; }; iterate_tuple(t, func); return is; } template istream &operator>>(istream &is, vector &v) { for (size_t i = 0, n = v.size(); i < n; i++) { is >> v[i]; } return is; } // ストリーム演算子 出力 template ostream &operator<<(ostream &os, const pair &p) { os << p.first << " " << p.second << " "; return os; } template ostream &operator<<(ostream &os, const tuple &t) { auto func = [&os](auto t) { os << t << " "; }; iterate_tuple(t, func); return os; } template ostream &operator<<(ostream &os, const vector &v) { for (size_t i = 0, n = v.size(); i < n; i++) { os << v[i] << " "; } return os; } template ostream &operator<<(ostream &os, const vector> &v) { for (size_t i = 0, n = v.size(); i < n; i++) { os << v[i] << endl; } return os; } template ostream &operator<<(ostream &os, const map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { os << "[" << itr->first << "]" << itr->second << endl; } return os; } template ostream &operator<<(ostream &os, const unordered_map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { os << "[" << itr->first << "]" << itr->second << endl; } return os; } template void input(T &a) { cin >> a; } template void input(T &a, R &...b) { input(a), input(b...); } template constexpr void output(const T &...a) { (cout << ... << (cout << a, " ")); cout << endl; } template pair operator+(const pair &a, const pair &b) { pair ret; ret = make_pair(a.first + b.first, a.second + b.second); return ret; } template pair operator+(const pair &a, const T3 &b) { pair ret; ret = make_pair(a.first + b, a.second + b); return ret; } template pair operator-(const pair &a, const pair &b) { pair ret; ret = make_pair(a.first - b.first, a.second - b.second); return ret; } template pair operator-(const pair &a, const T3 &b) { pair ret; ret = make_pair(a.first - b, a.second - b); return ret; } template vector operator+(const vector &a, const vector &b) { // aとbのサイズは一致する必要がある。 assert(a.size() == b.size()); vector ret = a; for (size_t i = 0; i < ret.size(); i++) { ret[i] = a[i] + b[i]; } return ret; } template vector operator+(const vector &a, const T2 &b) { vector ret = a; for (size_t i = 0; i < ret.size(); i++) { ret[i] = a[i] + b; } return ret; } // 二次元配列aを右回転する template constexpr vector> rotate_90deg(const vector> &a) { vector> b(a.front().size(), vector(a.size())); for (size_t i = 0; i < a.front().size(); i++) { for (size_t j = 0; j < a.size(); j++) { b[i][j] = (a[a.size() - 1 - j][i]); } } return b; } // 二次元配列aをelementで指定した要素を含み切るようにクリッピング vector clip_vec2(const vector &a, const char element) { ll left = LLONG_MAX, right = -1, top = LLONG_MAX, bottom = -1; for (size_t i = 0; i < a.size(); i++) { for (size_t j = 0; j < a.front().size(); j++) { if (a[i][j] == element) { chmin(top, (ll)i); chmax(bottom, (ll)i); chmin(left, (ll)j); chmax(right, (ll)j); } } } vector b(abs(bottom - top), string(abs(right - left), ' ')); for (size_t i = 0; i < b.size(); i++) { for (size_t j = 0; j < b.front().size(); j++) { b[i][j] = a[i + top][j + left]; } } return b; } template constexpr vector> clip_vec2(const vector> &a, const T element) { ll left = LLONG_MAX, right = -1, top = LLONG_MAX, bottom = -1; for (size_t i = 0; i < a.size(); i++) { for (size_t j = 0; j < a.front().size(); j++) { if (a[i][j] == element) { chmin(top, (ll)i); chmax(bottom, (ll)i); chmin(left, (ll)j); chmax(right, (ll)j); } } } vector> b(abs(bottom - top), vector(abs(right - left))); for (size_t i = 0; i < b.size(); i++) { for (size_t j = 0; j < b.front().size(); j++) { b[i][j] = a[i + top][j + left]; } } return b; } // 二次元配列aをelementで指定した要素で囲い込む vector envelope_vec2(const vector &a, const char element) { vector b = a; for (size_t i = 0; i < b.size(); i++) { b[i].insert(b[i].end(), {element, element}); std::rotate(b[i].rbegin(), b[i].rbegin() + 1, b[i].rend()); } b.push_back(string(b[0].size(), element)); b.push_back(b.back()); std::rotate(b.rbegin(), b.rbegin() + 1, b.rend()); return b; } template constexpr vector> envelope_vec2(const vector> &a, const T element) { vector> b = a; for (size_t i = 0; i < b.size(); i++) { b[i].insert(b[i].end(), {element, element}); std::rotate(b[i].rbegin(), b[i].rbegin() + 1, b[i].rend()); } b.push_back(vector(b[0].size(), element)); b.push_back(b.back()); std::rotate(b.rbegin(), b.rbegin() + 1, b.rend()); return b; } const long long mod1000 = 1000000007; const long long mod998 = 998244353; const string yes = "Yes"; const string no = "No"; int main() { ll n LIN; vll a(n); input(a); vll p(min(10, n)); REP(i, p.size()) p[i] = i + 1; map mp; do { ll sum = 0; REP(i, p.size()) { sum ^= (p[i] + a[i]); } if (mp.count(sum)) { REP(i, n) { if (i < p.size()) cout << p[i] << " "; else cout << i + 1 << " "; } cout << endl; REP(i, n) { if (i < mp[sum].size()) cout << mp[sum][i] << " "; else cout << i + 1 << " "; } cout << endl; exit(0); } mp[sum] = p; } while (next_permutation(been(p))); cout << -1 << endl; }