小 a a a 有 n n n 个数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,给出 q q q 个询问,每次询问给出区间 [ l , r ] [l, r] [l,r],现在请你找到一个数 x x x,使得 ∑ i = l r x ⊕ a i \sum\limits_{i = l}^r x \oplus a_i i=l∑rx⊕ai最大,要保证 0 ≤ x < 2 31 0 \le x < 2^{31} 0≤x<231。
第一行一个整数 n n n,表示序列的长度。第二行N个整数,表示序列内的元素。第三行一个整数 q q q,表示询问的个数。接下来 q q q 行,每行两个整数 l , r l,r l,r,表示询问的区间。
输出 q q q 行,每行一个整数表示答案。若有多组可行解,请输出较小的解。
输入 5 4 78 12 1 3 3 2 5 1 4 3 3 输出 2147483632 2147483635 2147483635
对于 30 % 30\% 30% 的数据, n , q ≤ 10 n, q ≤ 10 n,q≤10。对于 60 % 60\% 60% 的数据, n , q ≤ 1000 n, q ≤ 1000 n,q≤1000。对于 100 % 100\% 100% 的数据, n , q ≤ 1 0 5 n, q ≤ 10^5 n,q≤105。保证 a i a_i ai$ <$ 2 31 2^{31} 231。
将所有数拆成 31 31 31 位二进制数。对于一个区间 [ l , r ] [l,r] [l,r],若 $x $ 的第 j j j 位为 1 1 1,且 [ l , r ] [l,r] [l,r] 内第 j j j 位为 0 0 0 的数字个数为 s e g 0 seg_0 seg0,那么对和式 ∑ i = l r x ⊕ a i \sum\limits_{i = l}^r x \oplus a_i i=l∑rx⊕ai 产生的贡献为 s e g 0 × 2 j seg_0\times 2^j seg0×2j;同理,若 x x x 的第 j j j 位为 0 0 0 ,且 [ l , r ] [l,r] [l,r] 内第 j j j 位为 1 1 1 的数字个数为 s e g 1 seg_1 seg1,那么对和式 ∑ i = l r x ⊕ a i \sum\limits_{i = l}^r x \oplus a_i i=l∑rx⊕ai 产生的贡献为 s e g 1 × 2 j seg_1\times 2^j seg1×2j。 s e g 0 × 2 j > s e g 1 × 2 j seg_0\times 2^j>seg_1\times 2^j seg0×2j>seg1×2j 的充要条件是 s e g 0 > s e g 1 seg_0>seg_1 seg0>seg1。每次询问一个区间 [ l , r ] [l,r] [l,r],我们依次考察 [ l , r ] [l,r] [l,r] 内所有数的第 0 ∼ 30 0\sim 30 0∼30 位,若某一位 0 0 0 居多,则 x x x 在该位取 1 1 1;否则, x x x 在该位取 0 0 0。 显然,可以预处理某一位 1 1 1 个数的前缀和,考察一个区间时,可以 O ( 1 ) O(1) O(1) 得到答案。