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;
int n;
int a[200000];
int b[200000];
int ans;
int p[2000000];
map<int, int> code;
bool cmp(int a, int b) { return a < b; }
void update1(int v, int l, int r, int x, int value) {
  if (l == r) {
    p[v] = value;
    return;
  }
  int lr = (l + r) >> 1;
  if (x <= lr)
    update1(v + v, l, lr, x, value);
  else
    update1(v + v + 1, lr + 1, r, x, value);
  p[v] = max(p[v + v], p[v + v + 1]);
}
int Max(int v, int l, int r, int pl, int pr) {
  if (pl > pr) return 0;
  if (pl == l && pr == r) return p[v];
  int lr = (l + r) >> 1;
  return max(Max(v + v, l, lr, pl, min(pr, lr)),
             Max(v + v + 1, lr + 1, r, max(pl, lr + 1), pr));
}
void update2(int v, int l, int r, int x, int value) {
  if (l == r) {
    p[v] = value;
    return;
  }
  int lr = (l + r) >> 1;
  if (x <= lr)
    update2(v + v, l, lr, x, value);
  else
    update2(v + v + 1, lr + 1, r, x, value);
  p[v] = min(p[v + v], p[v + v + 1]);
}
int Min(int v, int l, int r, int pl, int pr) {
  if (pl > pr) return n + 1;
  if (pl == l && pr == r) return p[v];
  int lr = (l + r) >> 1;
  return min(Min(v + v, l, lr, pl, min(pr, lr)),
             Min(v + v + 1, lr + 1, r, max(pl, lr + 1), pr));
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n; i++) b[i] = a[i + 1];
  sort(b, b + n, cmp);
  for (int i = 0; i < n; i++) code[b[i]] = i;
  for (int i = 0; i < 2000000; i++) p[i] = 0;
  for (int i = 1; i <= n; i++) {
    update1(1, 0, n - 1, code[a[i]], i);
    int p = Max(1, 0, n - 1, code[a[i]] + 1, n - 1);
    if (p > 0) ans = max(a[p] ^ a[i], ans);
  }
  for (int i = 0; i < 2000000; i++) p[i] = n + 1;
  for (int i = n; i > 0; i--) {
    update2(1, 0, n - 1, code[a[i]], i);
    int p = Min(1, 0, n - 1, code[a[i]] + 1, n - 1);
    if (p < n + 1) ans = max(a[p] ^ a[i], ans);
  }
  printf("%d", ans);
  return 0;
}
