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 a[100010], ne[100010];
struct Tree {
  int l, r, mx;
};
Tree seg[400010];
void build(int id, int L, int R) {
  seg[id].l = L;
  seg[id].r = R;
  if (L == R)
    seg[id].mx = -100;
  else {
    int mid = (L + R) / 2;
    build(id * 2, L, mid);
    build(id * 2 + 1, mid + 1, R);
    seg[id].mx = max(seg[id * 2].mx, seg[id * 2 + 1].mx);
  }
}
void insert(int id, int pos, int val) {
  if (seg[id].l == seg[id].r) {
    seg[id].mx = val;
    return;
  }
  int mid = (seg[id].l + seg[id].r) / 2;
  if (pos <= mid)
    insert(id * 2, pos, val);
  else
    insert(id * 2 + 1, pos, val);
  seg[id].mx = max(seg[id * 2].mx, seg[id * 2 + 1].mx);
}
int query(int id, int val) {
  int mx = seg[id].mx;
  if (mx < val) return -1;
  if (seg[id].l == seg[id].r) return seg[id].mx;
  int mx1 = seg[id * 2].mx;
  int mx2 = seg[id * 2 + 1].mx;
  if (mx2 > val)
    return query(id * 2 + 1, val);
  else
    return query(id * 2, val);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  int maxx = 0;
  for (int i = 0; i < 2; i++) {
    build(1, 0, n - 1);
    insert(1, 0, a[0]);
    for (int i = 1; i < n; i++) {
      int id = query(1, a[i]);
      if (id != -1) maxx = max(maxx, id ^ a[i]);
      insert(1, i, a[i]);
    }
    reverse(a, a + n);
  }
  printf("%d\n", maxx);
  return 0;
}
