#include <bits/stdc++.h>
using namespace std;
long long a[5008611], ans = 0, n;
long long bin[50], Log[100861], mn[50][100861];
map<long long, long long> mp;
map<pair<long long, long long>, long long> mp1;
void init() {
  bin[0] = 1;
  for (int i = 1; i < 20; i++) bin[i] = bin[i - 1] * 2;
  Log[0] = -1;
  for (int i = 1; i <= 100005; i++) Log[i] = Log[i / 2] + 1;
  for (int i = 1; i <= n; i++) mn[0][i] = a[i];
  for (int i = 1; i <= Log[n]; i++)
    for (int j = 1; j <= n; j++)
      if (j + bin[i] - 1 <= n)
        mn[i][j] = max(mn[i - 1][j], mn[i - 1][j + bin[i - 1]]);
}
long long query(long long l, long long r) {
  long long len = Log[r - l + 1];
  return max(mn[len][l], mn[len][r - bin[len] + 1]);
}
void cal(long long l, long long r) {
  if (l >= r) {
    return;
  }
  if (mp1.count(make_pair(l, r)) != 0) return;
  long long maxl, maxr, posl = -1, posr = -1;
  long long maxx = query(l, r);
  long long pos = mp[maxx], now = 0;
  if (pos == r) {
    maxl = query(l, pos - 1);
    posl = mp[maxl];
    now = max(now, maxx ^ maxl);
  } else if (pos == l) {
    maxr = query(pos + 1, r);
    posr = mp[maxr];
    now = max(now, maxx ^ maxr);
  } else {
    maxl = query(l, pos - 1);
    maxr = query(pos + 1, r);
    posl = mp[maxl], posr = mp[maxr];
    now = max(now, max(maxr ^ maxx, maxl ^ maxx));
  }
  mp1[make_pair(l, r)] = now;
  ans = max(ans, now);
  if (posl != -1) cal(posl + 1, pos);
  if (posr != -1) cal(pos, posr - 1);
  cal(l, pos - 1);
  cal(pos + 1, r);
}
int main() {
  long long i, j;
  scanf("%lld", &n);
  for (i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    mp[a[i]] = i;
  }
  init();
  ans = 0;
  cal(1, n);
  printf("%lld\n", ans);
  return 0;
}

### Prompt

Your challenge is to write 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;
long long a[5008611], ans = 0, n;
long long bin[50], Log[100861], mn[50][100861];
map<long long, long long> mp;
map<pair<long long, long long>, long long> mp1;
void init() {
  bin[0] = 1;
  for (int i = 1; i < 20; i++) bin[i] = bin[i - 1] * 2;
  Log[0] = -1;
  for (int i = 1; i <= 100005; i++) Log[i] = Log[i / 2] + 1;
  for (int i = 1; i <= n; i++) mn[0][i] = a[i];
  for (int i = 1; i <= Log[n]; i++)
    for (int j = 1; j <= n; j++)
      if (j + bin[i] - 1 <= n)
        mn[i][j] = max(mn[i - 1][j], mn[i - 1][j + bin[i - 1]]);
}
long long query(long long l, long long r) {
  long long len = Log[r - l + 1];
  return max(mn[len][l], mn[len][r - bin[len] + 1]);
}
void cal(long long l, long long r) {
  if (l >= r) {
    return;
  }
  if (mp1.count(make_pair(l, r)) != 0) return;
  long long maxl, maxr, posl = -1, posr = -1;
  long long maxx = query(l, r);
  long long pos = mp[maxx], now = 0;
  if (pos == r) {
    maxl = query(l, pos - 1);
    posl = mp[maxl];
    now = max(now, maxx ^ maxl);
  } else if (pos == l) {
    maxr = query(pos + 1, r);
    posr = mp[maxr];
    now = max(now, maxx ^ maxr);
  } else {
    maxl = query(l, pos - 1);
    maxr = query(pos + 1, r);
    posl = mp[maxl], posr = mp[maxr];
    now = max(now, max(maxr ^ maxx, maxl ^ maxx));
  }
  mp1[make_pair(l, r)] = now;
  ans = max(ans, now);
  if (posl != -1) cal(posl + 1, pos);
  if (posr != -1) cal(pos, posr - 1);
  cal(l, pos - 1);
  cal(pos + 1, r);
}
int main() {
  long long i, j;
  scanf("%lld", &n);
  for (i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    mp[a[i]] = i;
  }
  init();
  ans = 0;
  cal(1, n);
  printf("%lld\n", ans);
  return 0;
}

```