异或症
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给你一个长度为 n 的从 1n 的排列 P 你可以执行以下操作任意次:


任选两个数 i, j (1 \leq i, j \leq n) 使 p_{i} = p_{i}\oplus j


在你执行完所有操作之后执行以下操作:


2n 按顺序执行,对于当前 ip_{i} = p_{i}\oplus p_{i - 1}


最后,求最大的 p_{1} + p_{2} + p_{3} + \cdots + p_{n}


\mathbf{\oplus}: \oplus表示二进制的异或位运算,对于每一个二进制位,相同为 0,不同为 1,例如,3\oplus 10 = 9,因为0011_{(2)}\oplus 1010_{(2)} = 1001_{(2)}


排列: 长度为 n 的排列是由 n 个不同的整数组成的数组,这些整数从 1n 按任意顺序排列。例如 [2,3,1,5,4] 是一个排列,但 [1,2,2] 不是一个排列(2在数组中出现了两次),[1,3,4] 也不是一个排列( n=3,但数组中有 4 )。

输入描述:

第一行包含一个整数 n ( 1 \le n \leq 3 \cdot 10^5 ),表示数组的大小。


第二行包含 n 个整数 p_{1},p_{2},\cdots,p_{n} (1\le p_{i} \le n)

输出描述:

输出一个数,表示最大的 p_{1} + p_{2} + p_{3} +\cdots + p_{n}

示例1

输入

复制
2
1 2

输出

复制
6