QOJ.ac

QOJ

Time Limit: 2 s Memory Limit: 16 MB - 512 MB Total points: 100

#10357. 被操纵的线段树

统计

Note: Some inputs have extra tokens at the end.

WWT大爷是一个魔法师,最近他盯上了OI中的线段树这个数据结构,并且正在对它进行改造。

在普通的线段树当中,对于一个区间$[l,r]$,我们会选择$mid= \lfloor \frac{l+r}{2} \rfloor$,将该区间分成$[l,mid],[mid+1,r]$。它们在树上则对应的节点是原区间对应的节点的左右儿子。

魔法师WWT使用了高位魔法将此规则打破,在他的线段树里,他可以自己选择$mid$的值(但$mid$依然满足$l \leq mid < r$),以至于使得线段树的深度超过原来的限制$O(logn)$,以及区间定位时间复杂度超过原来的限制$O(logn)$。但其余条件基本同原OI中的线段树。

如下图,是一棵mid任意的线段树:

problem_10357_1.png
    *什么是区间定位:
    用最少的线段树上节点表示的线段去拟合这个区间,使得每个单位长度有且仅在这些线段中出现一次。
    如上面这棵线段树,线段[2,5]的区间定位是[2,3],[4,4],[5,5],共三个。
    我们也不难证明这样的区间定位是唯一的。

魔法师WWT不仅使用了高位魔法打破了线段树的基本法,还使用了一些禁忌魔法修改了这个线段树的结构。他将指定树中的某个子结构进行左旋或者右旋的操作。如下图所示:

problem_10357_4.png
    不难发现该旋转规则同Splay的旋转模式类似。
    ①子树A,B,C不会产生任何变化。
    ②子树A,B,C及节点X,Y之间的相对位置会发生改变。
    ③节点X,Y的区间刻度会发生改变。

魔法师WWT会给你一棵$mid$值任意的线段树,在对这棵树的某些节点进行旋转的同时,询问你某个区间在当前线段树上的区间定位个数。

WWT觉得这样一道题还不能足以体现他高超的魔法水平,于是他又对某些数据进行了加密,使选手们的算法强制在线。

输入格式

第一行包括三个整数$N,Q,type$,分别代表线段树的宽度,操作个数,以及该数据是否加密。若$type=0$,表示这个数据没有进行加密,若$type=1$,表示这个数据进行了加密。

以下N-1行以先序遍历(深度优先顺序)描述一棵线段树,每行一个正整数表示当前非叶子节点的$mid$,保证每个节点$l \leq mid < r$。同时,我们将所有非叶子节点按照先序遍历标号,从$1$ ~ $N-1$。

    读入时建议选手直接采用递归,走到叶子节点时回溯即可,所以一共N-1个mid,而且保证1~N-1各出现一次。

此后$Q$行每行代表一个操作。

每行的第一个整数$tp$,代表该操作的类型:

若$tp=0$,则代表一个修改操作,该行还包括一个正整数$x'$,记$lastans$为上一次询问的答案,若之前没有询问操作,则$lastans=0$,我们定义$x=x' \oplus (type \times lastans)$。$x$表示该旋转操作的儿子节点编号,你需要以$x$以及$x$的父亲节点为轴进行一次旋转操作,若$x$是它父亲的左儿子则进行一次右旋,若$x$是它父亲的右儿子则进行一次左旋。WWT对自己的魔法过于自信,以至于有时他给的非叶子结点$x$是当前线段树的根的编号,这是一个非法的修改操作,此时你需要输出一行 "BAD!",并且不对当前的线段树进行任何操作

若$tp=1$,则代表一个询问操作,该行还包括两个正整数$l',r'$,记$lastans$为上一次询问的答案,若之前没有询问操作,则$lastans=0$,我们依次定义$l=l' \oplus (type \times lastans),r=r' \oplus (type \times lastans)$。则$[l,r]$表示该询问操作中的询问区间,对于每次询问,你需要给出在当前线段树上该区间的区间定位个数。

输出格式

输出包括若干行: 对于一个非法的修改操作,输出一行 "BAD!"; 对于一个询问操作,输出一个正整数,表示答案。

    对于一个合法的修改操作不需要输出。

样例输入

7 12 1
4
3
1
2
5
6
1 3 6
1 6 3
1 1 5
0 7
1 7 2
1 6 3
1 0 4
0 0
1 0 5
1 6 3
1 3 7
0 0

样例输出

4
3
4
4
2
3
4
1
3
BAD!

样例解释

样例解密之后:

7 12 0
4
3
1
2
5
6
1 3 6
1 2 7
1 2 6
0 3
1 3 6
1 2 7
1 2 6
0 3
1 3 6
1 2 7
1 2 6
0 3

线段树初始形状如下:

problem_10357_1.png

$1:[3,6]$的区间定位是$[3,3],[4,4],[5,5],[6,6]$,共$4$个。

$2:[2,7]$的区间定位是$[2,3],[4,4],[5,7]$,共$3$个。

$3:[2,6]$的区间定位是$[2,3],[4,4],[5,5],[6,6]$,共$4$个。

$4:$ 以3及其父亲2为轴进行右旋,右旋后形状如下。

problem_10357_2.png

$5:[3,6]$的区间定位是$[3,3],[4,4],[5,5],[6,6]$,共$4$个。

$6:[2,7]$的区间定位是$[2,4],[5,7]$,共$2$个。

$7:[2,6]$的区间定位是$[2,4],[5,5],[6,6]$,共$3$个。

$8:$ 以3及其父亲1为轴进行右旋,右旋后形状如下。

problem_10357_3.png

$9:[3,6]$的区间定位是$[3,3],[4,4],[5,5],[6,6]$,共$4$个。

$10:[2,7]$的区间定位是$[2,4],[5,7]$,共$2$个。

$11:[2,6]$的区间定位是$[2,4],[5,5],[6,6]$,共$3$个。

$12:$ 3号点已经是当前的根,非法的修改操作,输出“BAD!"。

数据范围

在所有的数据中,对于解密后的$l,r,x$,满足$1 \leq l \leq r \leq N, 1 \leq x \leq N-1$。

测试点编号 N的大小不超过 Q的大小不超过 Type的值 是否有修改操作 空间限制
1 1000 1000 0 512MB
2 1
3 0
4 1
5 200000 200000 0
6
7
8
9 1
10
11
12 0
13 64MB
14 16MB
15 1 512MB
16
17 64MB
18
19 16MB
20