Your Shine Your Be!
时间限制:C/C++/Rust/Pascal 4秒,其他语言8秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
Special Judge, 64bit IO Format: %lld

题目描述

给定一个长度为 n 的非负整数序列 a_1, a_2, \dots, a_n

现有 q 次查询,每次查询给定一个区间 [l, r]。对于每次查询,你需要从区间 [l, r] 所包含的元素构成的多重集 V 中挑选一个大小最大的子集 M,使得 M 中任意两个元素的权值互不相同。随后,你可以从选出的集合 M 中再任选一个子集 T(允许为空集)。设 |M| 为集合 M 的大小,X_T 为集合 T 中所有元素权值的按位异或和(空集的异或和规定为 0),求出 |M| \oplus X_T 的最小值。

本题强制在线。每次查询给出的 l', r' 是加密后的结果。记上一次查询的答案为 lastans(初始时 lastans = 0)。实际的查询区间端点 l, r 可通过如下方式解密得到:

                                                                                                           l = (l' \oplus lastans) \bmod n + 1

                                                                                                          r = (r' \oplus lastans) \bmod n + 1

解密后,若 l > r,你需要交换 l 和 r 的值。

输入描述:

第一行包含两个整数 n, q (1 \le n, q \le 5 \cdot 10^5)。

第二行包含 n 个整数 a_1, a_2, \dots, a_n (0 \le a_i \le n)。

接下来 q 行,每行两个整数 l', r' (0 \le l', r' \le 2 \cdot 10^9),表示加密后的查询区间端点。

输出描述:

对于每组询问,输出一行一个数字表示结果。
示例1

输入

复制
6 3
4 4 6 6 0 0
6 6
2 4
6 3

输出

复制
1
2
1

备注:

初始 lastans = 0。

  • 第一次查询:解密得 l = 1, r = 1。区间内元素构成的集合 S = 4,|S| = 1。选空集 ∅(异或和为 0),答案为 1 ⊕ 0 = 1。更新 lastans = 1。

  • 第二次查询:解密得 l = 4, r = 6。区间内元素构成的集合 S = 0, 6,|S| = 2。选空集 ∅(异或和为 0),答案为 2 ⊕ 0 = 2。更新 lastans = 2。

  • 第三次查询:解密得 l = 5, r = 2,交换端点得 [2, 5]。区间内元素构成的集合 S = 0, 4, 6,|S| = 3。选子集 4, 6(异或和为 2),答案为 3 ⊕ 2 = 1。更新 lastans = 1。

本题输入输出数据量较大,建议使用较快的输入输出方式。C++ 选手建议使用 scanf/printf,或在使用 cin/cout 时取消同步流:

std::ios::sync_with_stdio(false);

std::cin.tie(nullptr);