1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #include <bits/stdc++.h> #define MAXN 1000005 using namespace std; inline int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } void print(int x){ if (x>9) print(x/10); putchar('0'+x%10); } inline void Print(int x,char ch){ if (x==0) return putchar('0'),putchar(ch),void(); if (x<0) x=-x,putchar('-'); print(x); putchar(ch); } int rt[MAXN]; namespace Trie{ struct node{ int ch[2]; int sz; }tree[MAXN<<5]; #define ch(i,p) tree[i].ch[p] int tot; void Insert(int &i,int pre,int index,int x){ tree[i=++tot].sz=tree[pre].sz; if (index<0){ tree[i].sz++; return ; } bool pos=(x>>index)&1; ch(i,pos^1)=ch(pre,pos^1); Insert(ch(i,pos),ch(pre,pos),index-1,x); tree[i].sz=tree[ch(i,0)].sz+tree[ch(i,1)].sz; } int Query(int index,int l,int r,int x){ if (index<0) return 0; bool pos=(x>>index)&1; int k=tree[ch(r,pos^1)].sz-tree[ch(l,pos^1)].sz; if (k>0) return Query(index-1,ch(l,pos^1),ch(r,pos^1),x)+(1<<index); else return Query(index-1,ch(l,pos),ch(r,pos),x); } } using namespace Trie; inline char gc(){ char ch=getchar(); while (ch!='A'&&ch!='Q') ch=getchar(); return ch; } int a[MAXN],id[MAXN],pre[MAXN],nex[MAXN]; inline int cmp(int i,int j){ return a[i]<a[j]; } int L[MAXN],R[MAXN]; int main(){ int n=read(); for (register int i=1;i<=n;++i){ a[i]=read(),pre[i]=i-1,nex[i]=i+1; } pre[0]=1,nex[n]=n; for (register int i=1;i<=n;++i){ Insert(rt[i],rt[i-1],31,a[i]); } for (register int i=1;i<=n;++i){ id[i]=i; } sort(id+1,id+1+n,cmp); for (register int i=1;i<=n;++i){ nex[pre[id[i]]]=nex[id[i]]; pre[nex[id[i]]]=pre[id[i]]; L[id[i]]=pre[pre[id[i]]]; R[id[i]]=nex[nex[id[i]]]; } int ans=0; for (register int i=1;i<=n;++i){ ans=max(ans,Query(31,rt[L[i]],rt[R[i]-1],a[i])); } printf("%d\n",ans); }
|