#P16379. [2024年南京集训]巩固

[2024年南京集训]巩固

题目描述

你有一棵长度为 nn 的线段树。

以下给出本题中线段树的定义。该定义可能与你熟悉的线段树有所不同。

  • 线段树是一棵有根二叉树,每个节点对应序列上的一个区间 [l,r][l,r],根节点对应区间 [1,n][1,n]
  • 对于一个表示区间 [l,r][l,r] 的节点:
    • rl=0r-l=0,则该节点为叶节点;
    • 否则,存在一个整数 mm,满足 lm<rl\le m<r,其左儿子表示区间 [l,m][l,m],右儿子表示区间 [m+1,r][m+1,r]
  • 线段树的形态取决于每个非叶节点所选择的划分点 mm

你需要进行 qq 次修改或询问。

每次修改会对树中的一个局部结构进行左旋或右旋,其形式如下图所示:

旋转时:

  • 子树 A,B,CA,B,C 内部不会发生任何变化;
  • 子树 A,B,CA,B,C 以及节点 X,YX,Y 的相对位置会改变;
  • 节点 X,YX,Y 所表示的区间会改变。

每次询问给定一个区间,要求计算该区间至少可以由多少个线段树节点所表示的区间直接相加得到。

输入格式

从文件 entrench.in 中读入数据。

第一行包含三个整数 n,q,typen,q,\mathrm{type},分别表示线段树长度、修改与询问的总数,以及是否强制在线。

接下来 2n12n-1 行,第 ii 行包含四个整数

li, ri, Li, Ri,l_i,\ r_i,\ L_i,\ R_i,

分别表示编号为 ii 的线段树节点所表示区间的左端点、右端点、左儿子编号和右儿子编号。若某个儿子不存在,则对应编号为 00

保证:

  • 叶节点编号不小于 nn
  • 非叶节点编号小于 nn

接下来 qq 行,每行包含一个操作,格式如下。

修改操作

1 x

表示以节点 xx 及其父节点为轴进行旋转:

  • xx 为根节点,忽略本次操作;
  • xx 是其父节点的左儿子,进行右旋;
  • xx 是其父节点的右儿子,进行左旋。

查询操作

2 l r

表示查询区间 [l,r][l,r]。若 l>rl>r,则交换 l,rl,r

强制在线规则

输入中的操作参数是加密后的 x,l,rx',l',r',实际参数按下式计算:

$$x=(x'+\mathrm{lastans}\times\mathrm{type})\bmod(n-1)+1,$$$$l=(l'+\mathrm{lastans}\times\mathrm{type})\bmod n+1,$$$$r=(r'+\mathrm{lastans}\times\mathrm{type})\bmod n+1.$$

其中,lastans\mathrm{lastans} 表示上一次查询的答案,初始时

lastans=0.\mathrm{lastans}=0.

输出格式

输出到文件 entrench.out 中。

对于每个查询操作,输出一行一个整数,表示答案。

样例 1

输入

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

输出

2

数据范围与约定

对于全部测试数据:

n,q1.n,q\ge 1.
测试点 nn 不超过 qq 不超过 是否在线 是否有修改 空间限制
1 10001000 512 MB
2
3
4
5~8 200000200000
9
10~11 64 MB
12 512 MB
13 64 MB
14 32 MB
15~16 512 MB
17 64 MB
18~20 32 MB