#P11127. [ROIR 2024] 二叉树的遍历 (Day 2)

    ID: 12495 远端评测题 1666ms 512MiB 尝试: 0 已通过: 0 显示难度省选/NOI− 上传者: 标签>2024Special JudgeROIR(俄罗斯)

[ROIR 2024] 二叉树的遍历 (Day 2)

背景

翻译自 ROIR 2024 D2T4。

二叉树有三种基本遍历方式:前序遍历(pre-order)、中序遍历(in-order)和后序遍历(post-order)。我们可以将这三种遍历方式进行概括:假设每个节点上记录一个整数 xx(取值范围为 −1-1 到 11),表示在遍历中输出该节点的时机,具体如下:

  • x=−1x = -1:在遍历其左右子树之前;
  • x=0x = 0:在遍历其左子树之后,遍历其右子树之前;
  • x=1x = 1:在遍历其左右子树之后。

因此,如果所有节点的 xx 值都是 −1-1,则遍历为前序遍历;如果都是 00,则为中序遍历;如果都是 11,则为后序遍历。

题目描述

考虑一棵有 nn 个节点的二叉树,节点编号从 11 到 nn。树的根节点为 11。最初,所有节点上的值都是 −1-1。

你需要处理 qq 个操作,操作类型如下:

  1. 将节点 l,l+1,…,rl, l + 1, \dots, r 上的值更改为 xx(xx 取值为 −1-1,00 或 11)。
  2. 查询节点 ii 在当前遍历方式中的位置。

需要输出所有第二种类型的操作的结果。

输入格式

第一行包含两个整数 nn 和 qq(1≤n,q≤1000001 \leq n, q \leq 100000)。

接下来 nn 行,每行包含两个整数 LiL_i 和 RiR_i(0≤Li,Ri≤n0 \leq L_i, R_i \leq n),分别表示节点 ii 的左子树和右子树的编号,若某个子树不存在则为 00。

保证 LiL_i 和 RiR_i 描述了一个有效的二叉树。

接下来的 qq 行中包含操作。每行的第一个整数 tt(t∈{1,2}t \in \{1, 2\})表示操作类型。

  • 对于第一种类型的操作,后面有三个整数 ll,rr 和 xx(1≤l≤r≤n1 \leq l \leq r \leq n,xx 为 −1-1,00 或 11),表示节点范围和新的值。
  • 对于第二种类型的操作,后面有一个整数 ii(1≤i≤n1 \leq i \leq n),表示询问其在遍历中的位置的节点编号。

输出格式

对于每个第二种类型的操作,输出一个整数,表示对应节点在遍历中的位置。

5 5
3 4
0 0
5 2
0 0
0 0
2 2
1 1 3 1
2 5
1 3 3 0
2 3
4
1
2

提示

样例中的树是这样的:

刚开始,所有节点的 xx 值都是 −1-1,因此第一次查询时遍历得到的数组为 [1,3,5,2,4][1,3,5,2,4],22 在第四个位置。

在将节点 1,2,31,2,3 的遍历方式 xx 改为 11 后,再次查询时遍历得到的数组为 [5,2,3,4,1][5,2,3,4,1],55 在第一个位置。

接着把节点 33 的遍历方式 xx 改为 00,此时再进行查询,遍历得到的数组为 [5,3,2,4,1][5,3,2,4,1],33 在第二个位置。

设 q1q_1 为操作 11 的数量。

子任务 分值 特殊性质
00 同样例
11 1010 n,q≤5000n, q \leq 5000
22 55 q1≤10q_1 \leq 10
33 1010 所有操作一在所有操作二之前
44 所有叶子节点都与根节点距离相同,没有具有一个子节点的节点
55 对于所有操作一,l=rl = r
66 2020 对于所有操作一,x∈{−1,1}x \in \{-1, 1\},每个节点最多有一个子节点
77 1010 对于所有操作一,x∈{−1,1}x \in \{-1, 1\}
88 每个节点最多有一个子节点
99 1515 无

对于 100%100\% 的数据,1≤n,q≤1000001 \leq n, q \leq 100000。