#include <bits/stdc++.h>
using namespace std;
int n, a[100010], maxi[100010][20];
long long ans;
struct node {
  node *ch[2];
  node() { ch[0] = ch[1] = NULL; }
} * L, *R;
int MAX(int x, int y) { return a[x] > a[y] ? x : y; }
void insert(node *(&o), int x, int k) {
  if (o == NULL) o = new node;
  if (!k) return;
  insert(o->ch[!!(x & k)], x, k >> 1);
}
long long find(node *o, int x, int k) {
  if (o == NULL) return 0;
  bool t((x & k));
  if (o->ch[t ^ 1])
    return k | find(o->ch[t ^ 1], x, k >> 1);
  else
    return find(o->ch[t], x, k >> 1);
}
long long find(int L, int R) {
  int k(0), len(1);
  while ((len << 1) < (R - L + 1)) k++, len <<= 1;
  return MAX(maxi[L][k], maxi[R - len + 1][k]);
}
void work(int L, int R, node *(&l), node *(&r)) {
  if (R < L) return;
  int o = find(L, R);
  node *r1(NULL), *l2(NULL);
  work(L, o - 1, l, r1);
  work(o + 1, R, l2, r);
  ans = max(max(find(r1, a[o], 1 << 30), find(l2, a[o], 1 << 30)), ans);
  insert(l, a[o], 1 << 30);
  insert(r, a[o], 1 << 30);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  for (int i = 1; i <= n; i++) maxi[i][0] = i;
  for (int k = 0, l = 1; (l << 1) <= n; l <<= 1, k++)
    for (int i = 1; i + (l << 1) - 1 <= n; i++)
      maxi[i][k + 1] = MAX(maxi[i][k], maxi[i + l][k]);
  work(1, n, L, R);
  printf("%lld", ans);
  return 0;
}

### Prompt

Generate a Cpp solution to the following problem:

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}.

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
int n, a[100010], maxi[100010][20];
long long ans;
struct node {
  node *ch[2];
  node() { ch[0] = ch[1] = NULL; }
} * L, *R;
int MAX(int x, int y) { return a[x] > a[y] ? x : y; }
void insert(node *(&o), int x, int k) {
  if (o == NULL) o = new node;
  if (!k) return;
  insert(o->ch[!!(x & k)], x, k >> 1);
}
long long find(node *o, int x, int k) {
  if (o == NULL) return 0;
  bool t((x & k));
  if (o->ch[t ^ 1])
    return k | find(o->ch[t ^ 1], x, k >> 1);
  else
    return find(o->ch[t], x, k >> 1);
}
long long find(int L, int R) {
  int k(0), len(1);
  while ((len << 1) < (R - L + 1)) k++, len <<= 1;
  return MAX(maxi[L][k], maxi[R - len + 1][k]);
}
void work(int L, int R, node *(&l), node *(&r)) {
  if (R < L) return;
  int o = find(L, R);
  node *r1(NULL), *l2(NULL);
  work(L, o - 1, l, r1);
  work(o + 1, R, l2, r);
  ans = max(max(find(r1, a[o], 1 << 30), find(l2, a[o], 1 << 30)), ans);
  insert(l, a[o], 1 << 30);
  insert(r, a[o], 1 << 30);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  for (int i = 1; i <= n; i++) maxi[i][0] = i;
  for (int k = 0, l = 1; (l << 1) <= n; l <<= 1, k++)
    for (int i = 1; i + (l << 1) - 1 <= n; i++)
      maxi[i][k + 1] = MAX(maxi[i][k], maxi[i + l][k]);
  work(1, n, L, R);
  printf("%lld", ans);
  return 0;
}

```