#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2, typename T3>
struct triple {
  T1 a;
  T2 b;
  T3 c;
  triple(){};
  triple(T1 _a, T2 _b, T3 _c) : a(_a), b(_b), c(_c) {}
};
inline long long gcd(long long a, long long b) {
  long long t;
  while (b) {
    a = a % b;
    t = a;
    a = b;
    b = t;
  }
  return a;
}
inline int gcd(int a, int b) {
  int t;
  while (b) {
    a = a % b;
    t = a;
    a = b;
    b = t;
  }
  return a;
}
inline long long lcm(int a, int b) { return a / gcd(a, b) * (long long)b; }
inline long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
inline long long gcd(long long a, long long b, long long c) {
  return gcd(gcd(a, b), c);
}
inline int gcd(int a, int b, int c) { return gcd(gcd(a, b), c); }
inline long long lcm(long long a, long long b, long long c) {
  return lcm(lcm(a, b), c);
}
inline long long lcm(int a, int b, int c) {
  return lcm(lcm(a, b), (long long)c);
}
inline void print_stacki(stack<int> s) {
  while (s.size()) cerr << s.top() << " ", s.pop();
  cerr << endl;
}
inline void print_stackc(stack<char> s) {
  while (s.size()) cerr << s.top() << " ", s.pop();
  cerr << endl;
}
inline void pvi(vector<int> v) {
  for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << endl;
}
inline long long max(long long a, long long b) { return (a > b) ? a : b; }
inline int max(int a, int b) { return (a > b) ? a : b; }
inline double max(double a, double b) { return (a > b) ? a : b; }
inline long long max(long long a, long long b, long long c) {
  return max(a, max(b, c));
}
inline int max(int a, int b, int c) { return max(a, max(b, c)); }
inline double max(double a, double b, double c) { return max(a, max(b, c)); }
inline long long min(long long a, long long b) { return (a < b) ? a : b; }
inline int min(int a, int b) { return (a < b) ? a : b; }
inline double min(double a, double b) { return (a < b) ? a : b; }
inline long long min(long long a, long long b, long long c) {
  return min(a, min(b, c));
}
inline int min(int a, int b, int c) { return min(a, min(b, c)); }
inline double min(double a, double b, double c) { return min(a, min(b, c)); }
int oo = 0x3f3f3f3f;
vector<int> v;
unordered_map<int, int> mf, mb;
int main() {
  clock_t begin = clock();
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int n, mx = 0;
  cin >> n;
  v.resize(n);
  for (int i = 0; i < n; i++) cin >> v[i];
  stack<int> stf, stb;
  for (int i = 0; i < n; i++) {
    while (stf.size() and stf.top() < v[i]) mf[stf.top()] = v[i], stf.pop();
    stf.push(v[i]);
  }
  while (stf.size()) mf[stf.top()] = -1, stf.pop();
  for (int i = n - 1; i >= 0; i--) {
    while (stb.size() and stb.top() < v[i]) mb[stb.top()] = v[i], stb.pop();
    stb.push(v[i]);
  }
  while (stb.size()) mb[stb.top()] = -1, stb.pop();
  for (int i = 0; i < n; i++)
    mx = max(mx, ((v[i]) ^ (mf[v[i]])), ((v[i]) ^ (mb[v[i]])));
  cout << mx;
  clock_t end = clock();
  return 0;
}
