1 #include <iostream>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <cstring>
5 #include <algorithm>
6 #include <cmath>
7 #include <queue>
8 #include <set>
9 #include <vector>
10 #define N 50006
11 #define lowbit(x) (x&(-x))
12 using namespace std;
13 int n,a[N],b[N];
14 set<int> q;
15 struct node{
16 int size;
17 node* ch[2];
18 node() {
19 size=0;
20 ch[1]=ch[0]=0;
21 }
22 }*null=new node(),*root[N];
23 node* newnode()
24 {
25 node* x=new node();
26 x->ch[0]=x->ch[1]=null;
27 return x;
28 }
29 void insert(node* la,node* now,int js,int x)
30 {
31 now->size=la->size+1;
32 if(!js)return;
33 if(x&(1ll<<(js-1)))
34 {
35 now->ch[0]=la->ch[0];
36 now->ch[1]=newnode();
37 insert(la->ch[1],now->ch[1],js-1,x);
38 }
39 else
40 {
41 now->ch[1]=la->ch[1];
42 now->ch[0]=newnode();
43 insert(la->ch[0],now->ch[0],js-1,x);
44 }
45 }
46 long long que(node* l,node* r,int x)
47 {
48 long long ans=0;
49 for(int i=32;i>=1;i--)
50 {
51 if(x&(1ll<<(i-1)))
52 {
53 if(r->ch[0]->size-l->ch[0]->size)
54 {
55 ans|=(1ll<<(i-1));
56 l=l->ch[0];
57 r=r->ch[0];
58 }
59 else
60 {
61 r=r->ch[1];
62 l=l->ch[1];
63 }
64 }
65 else
66 {
67 if(r->ch[1]->size-l->ch[1]->size)
68 {
69 ans|=(1ll<<(i-1));
70 l=l->ch[1];
71 r=r->ch[1];
72 }
73 else
74 {
75 r=r->ch[0];
76 l=l->ch[0];
77 }
78 }
79 }
80 return ans;
81 }
82 bool px(int x,int y)
83 {
84 return a[x]>a[y];
85 }
86 int main()
87 {
88 null->ch[0]=null->ch[1]=null;
89 root[0]=newnode();
90 scanf("%d",&n);
91 for(int i=1;i<=n;i++)
92 {
93 root[i]=newnode();
94 scanf("%d",&a[i]);
95 insert(root[i-1],root[i],32,a[i]);
96 b[i]=i;
97 }
98 sort(b+1,b+n+1,px);
99 long long ans=0;
100 q.insert(-2);q.insert(-1);
101 q.insert(1000000002);q.insert(1000000003);
102 q.insert(b[1]);
103 for(int i=2;i<=n;i++)
104 {
105 set<int>::iterator it,p;
106 p=it=q.lower_bound(b[i]);
107 int r,l;
108 it++;r=*it-1;
109 p--;p--; l=*p+1;
110 l=max(l,1);r=min(r,n);
111 if(l!=r)ans=max(ans,que(root[l-1],root[r],a[b[i]]));
112 q.insert(b[i]);
113 }
114 printf("%lld\n",ans);
115 return 0;
116 }