Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1, x2, ..., xk (k > 1) is such maximum element xj, that the following inequality holds: <image>.

The lucky number of the sequence of distinct positive integers x1, x2, ..., xk (k > 1) is the number that is equal to the bitwise excluding OR of the maximum element of the sequence and the second maximum element of the sequence.

You've got a sequence of distinct positive integers s1, s2, ..., sn (n > 1). Let's denote sequence sl, sl + 1, ..., sr as s[l..r] (1 ≤ l < r ≤ n). Your task is to find the maximum number among all lucky numbers of sequences s[l..r].

Note that as all numbers in sequence s are distinct, all the given definitions make sence.

Input

The first line contains integer n (1 < n ≤ 105). The second line contains n distinct integers s1, s2, ..., sn (1 ≤ si ≤ 109).

Output

Print a single integer — the maximum lucky number among all lucky numbers of sequences s[l..r].

Examples

Input

5
5 2 1 4 3


Output

7


Input

5
9 8 3 5 7


Output

15

Note

For the first sample you can choose s[4..5] = {4, 3} and its lucky number is (4 xor 3) = 7. You can also choose s[1..2].

For the second sample you must choose s[2..5] = {8, 3, 5, 7}.
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct node {
  int v, a, id;
} a[MAXN];
bool cmp(node a, node b) { return a.v < b.v; }
bool cmp2(node a, node b) { return a.id < b.id; }
int mi[MAXN << 2];
int mx[MAXN << 2];
void pushup(int o) {
  if (mi[o << 1] == 0 && mi[o << 1 | 1] == 0)
    mi[o] = 0;
  else if (mi[o << 1] > 0 && mi[o << 1 | 1] == 0)
    mi[o] = mi[o << 1];
  else if (mi[o << 1] == 0 && mi[o << 1 | 1] > 0)
    mi[o] = mi[o << 1 | 1];
  else
    mi[o] = min(mi[o << 1], mi[o << 1 | 1]);
  mx[o] = max(mx[o << 1], mx[o << 1 | 1]);
}
void update(int l, int r, int o, int p, int v) {
  if (l == r) {
    mi[o] = v;
    mx[o] = v;
    return;
  }
  int m = l + r >> 1;
  if (p <= m)
    update(l, m, o << 1, p, v);
  else
    update(m + 1, r, o << 1 | 1, p, v);
  pushup(o);
}
int val1, val2;
void call(int l, int r, int o, int L, int R) {
  if (L <= l && r <= R) {
    if (mi[o] > 0) val1 = min(mi[o], val1);
    val2 = max(mx[o], val2);
    return;
  }
  int m = l + r >> 1;
  if (L <= m) call(l, m, o << 1, L, R);
  if (m < R) call(m + 1, r, o << 1 | 1, L, R);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].v);
    a[i].id = i;
  }
  sort(a + 1, a + n + 1, cmp);
  int sz = 1;
  for (int i = 1; i <= n; i++) {
    if (a[i].v == a[i + 1].v) {
      a[i].a = sz;
    } else {
      a[i].a = sz;
      sz++;
    }
  }
  sort(a + 1, a + n + 1, cmp2);
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    val2 = 0;
    if (a[i].a + 1 <= n) call(1, n, 1, a[i].a + 1, n);
    if (val2 > 0) {
      ans = max(ans, a[val2].v ^ a[i].v);
    }
    update(1, n, 1, a[i].a, i);
  }
  memset(mi, 0, sizeof(mi));
  for (int i = n; i >= 1; i--) {
    val1 = MAXN;
    if (a[i].a + 1 <= n) call(1, n, 1, a[i].a + 1, n);
    if (val1 != MAXN) {
      ans = max(ans, a[val1].v ^ a[i].v);
    }
    update(1, n, 1, a[i].a, i);
  }
  printf("%d\n", ans);
  return 0;
}
