BZOJ 2741: 【FOTILE模拟赛】L

正文索引 [隐藏]

Description

FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和。
即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 … xor Aj),其中l<=i<=j<=r。
为了体现在线操作,对于一个询问(x,y):
l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
其中lastans是上次询问的答案,一开始为0。

Input

第一行两个整数N和M。
第二行有N个正整数,其中第i个数为Ai,有多余空格。
后M行每行两个数x,y表示一对询问。

Output

共M行,第i行一个正整数表示第i个询问的结果。

Sample Input

3 3
1 4 3
0 1
0 1
4 3

Sample Output

5
7
7

HINT

N=12000,M=6000,x,y,Ai在signed longint范围内。

题解

可持久化Trie树
我们把区间分块,预处理出每个块的开头为开头,结尾随意的答案,记为F[i][j]
查询的时候很明显,我们观察所有开头,如果开头处于一个已经预处理过的块中,那么我们可以直接获得这部分答案,如果不存在,那么就暴力计算。