#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const long long MAX = 5100000; const long long INF = 1LL << 60; const long long MOD = 1'000'000'007LL; //const long long mod = 998244353LL; using namespace std; typedef unsigned long long ull; typedef long long ll; template struct BinaryTrie { private: struct Node { int cnt; T lazy; Node *ch[2] = {}; Node() :cnt(0), lazy(0) {} }; Node* root; int size(Node *t) { return t ? t->cnt : 0; } void eval(Node* t, int bit_index) { if (!t->lazy)return; if (t->lazy >> bit_index)swap(t->ch[0], t->ch[1]); if (t->ch[0])t->ch[0]->lazy ^= t->lazy; if (t->ch[1])t->ch[1]->lazy ^= t->lazy; t->lazy = 0; } Node* insert(Node* t, T n, int bit_index) { if (!t)t = new Node; t->cnt += 1; if (bit_index == -1)return t; eval(t, bit_index); bool c = (n >> bit_index) & 1; t->ch[c] = insert(t->ch[c], n, bit_index - 1); return t; } Node* erase(Node* t, T n, int bit_index) { //assert(t); t->cnt -= 1; if (!t->cnt)return nullptr; if (bit_index == -1)return t; eval(t, bit_index); bool c = (n >> bit_index) & 1; t->ch[c] = erase(t->ch[c], n, bit_index - 1); return t; } T get_min(Node* t, T n, int bit_index) { //assert(t); if (bit_index<0)return 0; eval(t, bit_index); bool c = (n >> bit_index) & 1; T ret = 0; if (!t->ch[c])c ^= 1; return get_min(t->ch[c], n, bit_index - 1) | ((T)c << bit_index); } T get(Node* t, T n, int k, int bit_index) { //assert(t&&t->cnt<=k); if (bit_index<0)return 0; eval(t, bit_index); bool c = (n >> bit_index) & 1; if (size(t->ch[c])ch[c]), c ^= 1; return get(t->ch[c], n, k, bit_index - 1) | ((T)c << bit_index); } int count_lower(Node* t, T n, T val, int bit_index) { if (!t || bit_index<0)return 0; eval(t, bit_index); bool c = (n >> bit_index) & 1; int ret = 0; if ((val >> bit_index) & 1)ret += size(t->ch[c]), c ^= 1; return ret + count_lower(t->ch[c], n, val, bit_index - 1); } T calc(Node* t, int bit_index) { if (!t || bit_index<0)return 0; if (size(t->ch[0]) == 0)return calc(t->ch[1], bit_index - 1); if (size(t->ch[1]) == 0)return calc(t->ch[0], bit_index - 1); T ret = (1LL << bit_index) + min(calc(t->ch[0], bit_index - 1), calc(t->ch[1], bit_index - 1)); return ret; } public: BinaryTrie() :root(nullptr) {} int size() { return size(root); } bool empty() { return !root; } void insert(T n) { root = insert(root, n, B - 1); } void erase(T n) { root = erase(root, n, B - 1); } void xor_all(T n) { if (root) root->lazy ^= n; } T max_element(T bias = 0) { return get_min(root, ~bias, B - 1); } T min_element(T bias = 0) { return get_min(root, bias, B - 1); } int lower_bound(T x, T bias = 0) { return count_lower(root, bias, x, B - 1); } int upper_bound(T x, T bias = 0) { return count_lower(root, bias, x + 1, B - 1); } int count(T x) { return upper_bound(x) - lower_bound(x); } T get(int k, T bias = 0) { //assert(0<=k&&k> n; BinaryTrie<> bt; for (ll i = 0; i < n; i++) { int x; cin >> x; bt.insert(x); } cout << bt.calc() << endl; return 0; }