#CF2002D. DFS 检查器(简单版本)

DFS 检查器(简单版本)

D1. DFS 检查器(简单版本)
每次测试时间限制:2 秒
内存限制:512 兆字节


题目描述

这是该问题的简单版本。在此版本中,给定的树是一棵完美二叉树,并且 nnqq 的限制较低。只有当两个版本的问题都解决后,你才能进行 Hack。

你有一棵由 nn 个顶点组成的完美二叉树†。顶点编号为 11nn,根节点是顶点 11。你还获得了一个排列 p1,p2,,pnp_1, p_2, \dots, p_n,它是 [1,2,,n][1, 2, \dots, n] 的一个排列。

你需要回答 qq 个查询。对于每个查询,你会得到两个整数 xxyy;你需要交换 pxp_xpyp_y,然后判断当前的 p1,p2,,pnp_1, p_2, \dots, p_n 是否是给定树的一个合法 DFS 顺序‡。

请注意,查询中的交换是持久化的(即每次交换会保留到后续查询)。


定义

完美二叉树 是一棵以顶点 11 为根的树,其大小 n=2k1n = 2^k - 1kk 为正整数),并且每个顶点 ii1<in1 < i \le n)的父节点是 i2\left\lfloor \frac{i}{2} \right\rfloor。因此,该树的所有叶子节点到根的距离都是 k1k-1

DFS 顺序 是通过在给定树上调用以下 dfs 函数得到的顺序:

dfs_order = []

function dfs(v):
    将 v 追加到 dfs_order 末尾
    选择 v 的子节点的一个任意排列 s
    对于 s 中的每个子节点 child:
        dfs(child)

dfs(1)

注意,DFS 顺序并不是唯一的。


输入格式

每个测试点包含多个测试用例。第一行包含测试用例数 tt1t1041 \le t \le 10^4)。
每个测试用例的描述如下:

  • 第一行包含两个整数 nnqq3n655353 \le n \le 655352q51042 \le q \le 5 \cdot 10^4)—— 树的顶点数和查询数。保证 n=2k1n = 2^k - 1,其中 kk 为正整数。
  • 接下来一行包含 n1n-1 个整数 a2,a3,,ana_2, a_3, \dots, a_n1ai<i1 \le a_i < i)—— 每个顶点的父节点。保证 ai=i2a_i = \left\lfloor \frac{i}{2} \right\rfloor
  • 接下来一行包含 nn 个整数 p1,p2,,pnp_1, p_2, \dots, p_n1pin1 \le p_i \le n,所有 pip_i 互不相同)—— 初始排列 pp
  • 接下来 qq 行,每行包含两个整数 xxyy1x,yn1 \le x, y \le nxyx \neq y)—— 表示要交换排列中位置 xxyy 上的元素。

保证所有测试用例的 nn 之和不超过 6553565535,所有 qq 之和不超过 51045 \cdot 10^4


输出格式

对于每个测试用例,输出 qq 行,对应 qq 个查询。对于每个查询,如果当前排列存在一种 DFS 顺序恰好等于该排列,则输出 YES,否则输出 NO

大小写不敏感,例如 yEsyesYesYES 都会被识别为肯定回答。


样例输入

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

样例输出

YES
YES
NO
YES
NO
NO
YES

样例解释

在第一个测试用例中,每次修改后的排列 pp 依次为:
[1,3,2][1, 3, 2][1,2,3][1, 2, 3][3,2,1][3, 2, 1]
前两个排列是合法的 DFS 顺序,第三个不是。

在第二个测试用例中,每次修改后的排列 pp 依次为:
[1,2,5,4,3,6,7][1, 2, 5, 4, 3, 6, 7][1,3,5,4,2,6,7][1, 3, 5, 4, 2, 6, 7][1,3,7,4,2,6,5][1, 3, 7, 4, 2, 6, 5][1,3,7,6,2,4,5][1, 3, 7, 6, 2, 4, 5]