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

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

题目背景

翻译自 ROIR 2024 D2T4

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

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

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

题目描述

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

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

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

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

输入格式

第一行包含两个整数 nnqq1n,q1000001 \leq n, q \leq 100000)。

接下来 nn 行,每行包含两个整数 LiL_iRiR_i0Li,Rin0 \leq L_i, R_i \leq n),分别表示节点 ii 的左子树和右子树的编号,若某个子树不存在则为 00

保证 LiL_iRiR_i 描述了一个有效的二叉树。

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

  • 对于第一种类型的操作,后面有三个整数 llrrxx1lrn1 \leq l \leq r \leq nxx1-10011),表示节点范围和新的值。
  • 对于第二种类型的操作,后面有一个整数 ii1in1 \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,q5000n, q \leq 5000
22 55 q110q_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\% 的数据,1n,q1000001 \leq n, q \leq 100000