#pragma GCC optimize("Ofast") // @formatter:off #include using namespace std; // #include #define rep(i, n) for (int i = 0; i < (n); ++i) #define drep(i, n) for (int i = (n)-1; i >= 0; --i) #define srep(i, s, t) for (int i = s; i < t; ++i) #define rng(a) a.begin(), a.end() #define rrng(a) a.rbegin(), a.rend() using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VVVI = vector; using VL = vector; using VVL = vector; using VVVL = vector; using VVVVL = vector; using VP = vector

; using VVP = vector>; using VS = vector; using VC = vector; using VVC = vector>; using VD = vector; using VVD = vector>; using VVVD = vector; // #define MOD 1000000007 #define MOD 998244353 const int INF = 1000000007; const long long INFL = (ll)INF * INF; const int JU_5 = 100000; const int JU_6 = 1000000; const ll JU_9 = 1000000000; const ll JU_18 = JU_9 * JU_9; template bool chmax(T& a, C b) { if (a < b) { a = b; return true; } return false; } template bool chmin(T& a, C b) { if (a > b) { a = b; return true; } return false; } template T min(T a, C b) { return a <= b ? a : T(b); } template T max(T a, C b) { return a >= b ? a : T(b); } template ostream& operator<<(ostream& os, const deque& vec) { for (int i = 0; i < vec.size() - 1; i++) os << vec[i] << " "; if (vec.size()) os << vec.back(); return os; } template ostream& operator<<(ostream& os, const set& vec) { os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream& operator<<(ostream& os, const unordered_set& vec) { os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream& operator<<(ostream& os, const multiset& vec) { os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream& operator<<(ostream& os, const unordered_multiset& vec) { os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream& operator<<(ostream& os, const pair& pa) { os << "(" << pa.first << "," << pa.second << ")"; return os; } template ostream& operator<<(ostream& os, const map& mp) { os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; } template ostream& operator<<(ostream& os, const unordered_map& mp) { os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; } struct mint { ll x; int mod; mint(ll x = 0, int mod = MOD) : x((x % mod + mod) % mod), mod(mod) {} mint operator-() const { return mint(-x); } mint& operator+=(const mint a) { if ((x += a.x) >= mod) x -= mod; return *this; } mint& operator-=(const mint a) { if ((x += mod - a.x) >= mod) x -= mod; return *this; } mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this; } mint operator+(const mint a) const { mint res(*this); return res += a; } mint operator-(const mint a) const { mint res(*this); return res -= a; } mint operator*(const mint a) const { mint res(*this); return res *= a; } mint pow(ll t) const { if (!t) return 1; mint a = pow(t >> 1); a *= a; if (t & 1) a *= *this; return a; } mint inv() const { return pow(mod - 2); } mint& operator/=(const mint a) { return (*this) *= a.inv(); } mint operator/(const mint a) const { mint res(*this); return res /= a; } }; istream& operator>>(istream& is, mint& a) { return is >> a.x; } ostream& operator<<(ostream& os, const mint& a) { return os << a.x; } using VMI = vector; using VVMI = vector>; void print() { cout << endl; } template void print(Head&& head, Tail&&... tail) { cout << head; if (sizeof...(tail) != 0) cout << " "; print(forward(tail)...); } template void print(vector& vec) { for (auto& a : vec) { cout << a; if (&a != &vec.back()) cout << " "; } cout << endl << flush; } template void print(vector>& df) { for (auto& vec : df) { print(vec); } } #define YES cout << "YES" << endl #define NO cout << "NO" << endl #define Yes cout << "Yes" << endl #define No cout << "No" << endl ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } ///////////////////////////////////////////////////////// // @formatter:on struct Comb { int n; vector kaijo; vector gyaku; ll r(ll x) { while (x % MOD == 0) x /= MOD; return x; } // xの mod 進数 int rcnt(ll x) { if (x <= 0) return 0; return rcnt(x / MOD) + x / MOD; } Comb(int mn) : n(mn + 1), kaijo(mn + 1), gyaku(mn + 1) { // mod で割り切れるだけ割ったときの nCm を求められるように, 階乗と逆元を求める kaijo[0] = 1; for (int i = 1; i < n; i++) { kaijo[i] = kaijo[i - 1] * r(i); } gyaku[n - 1] = kaijo[n - 1].pow(MOD - 2); for (int i = n - 1; i > 0; i--) { gyaku[i - 1] = gyaku[i] * r(i); } } mint nCm(int n, int m) { if (n < m || m < 0) return 0; int cnt1 = rcnt(n); int cnt2 = rcnt(n - m) + rcnt(m); if (cnt1 > cnt2) return mint(0); assert(n < kaijo.size()); assert(m < gyaku.size()); return kaijo[n] * gyaku[n - m] * gyaku[m]; } mint nPm(int n, int m) { if (n < 0 || m > n) return 0; if (n == m) return kaijo[n]; int cnt1 = rcnt(n); int cnt2 = rcnt(n - m); if (cnt1 > cnt2) return mint(0); return kaijo[n] * gyaku[n - m]; } // 重複組合せ. n 種類の中から重複を許し m 個とる mint nHm(int n, int m) { int l = n + m - 1; int r = n - 1; if (l < 0 || r < 0) return mint(0); return nCm(l, r); } }; int bitcnt(long long x) { return __builtin_popcount(x); } void _main() { ll n; cin >> n; VL a(n); rep(i, n) cin >> a[i]; if (n >= 15) { print((1ll << 16) - 1); return; } auto shift = [](ll v) { ll res = v >> 1; res += (v & 1) << 15; return res; }; set st; st.insert(0); rep(i, n) { set nxt; ll v = a[i]; rep(j, 15) { for (auto p : st) { nxt.insert(v | p); } v=shift(v); } st=nxt; } print(*st.rbegin()); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); std::cout << std::setprecision(15); ////////////////////////////////////////// int t = 1; // cin >> t; while (t--) _main(); return 0; }