QOJ.ac

QOJ

حد الوقت: 30.0 s حد الذاكرة: 256 MB مجموع النقاط: 100

#17513. Hypervisor MacrOS

الإحصائيات

Bob 是一支开发 Hypervisor 系统 MacrOS 的团队的负责人。该项目非常庞大,包含许多软件包。由于其中一些软件包可能依赖于其他软件包,因此整个系统的安装过程相当复杂。MacrOS 目前处于 Alpha 阶段,因此有许多客户正在测试这个新产品。对许多人来说,安装过程非常繁琐,不幸的是,技术支持也是 Bob 的职责。

在 Alpha 测试开始之前,程序员团队给 Bob 提供了一份依赖关系列表。每条依赖关系写着“软件包 B 依赖于 A”,即必须在安装 B 之前先安装软件包 A。简记为 A B。当然,如果软件包 C 依赖于 B,而 B 又依赖于 A,那么 C 也依赖于 A,即依赖关系具有传递性。例如,初始的依赖关系列表可能如下:

1 6
6 3
3 4
2 5

随着产品的发展,程序员有时会打电话给 Bob,告知新的依赖关系。此外,作为技术支持负责人,Bob 经常接到客户的电话,询问应该先安装哪些软件包。不出所料,在接到程序员和客户的几次电话后,Bob 意识到要同时记录依赖关系并在线回答查询是多么困难。为了使这个过程自动化,他写了一个程序,生成了两个日志文件。第一个日志文件包含所有通话的历史记录。记录 1 A B 表示程序员引入了新的依赖关系,而 0 A B 表示客户的查询,意思是“我应该在 B 之前安装 A 吗?”。第二个日志文件是给客户的所有回答的历史记录。表 1 中给出了一个例子。

经过长期的测试,MacrOS 终于准备好进入 Beta 阶段。但 Bob 想确保在 Alpha 测试期间没有出现错误。他想检查第二个日志文件中给出的回答是否正确,而你需要帮助他。然而,Bob 并没有给你第二个日志文件。此外,他以一种巧妙的方式修改了第一个日志文件:在每条应该回答为 NO 的客户电话记录之后,他开始/停止反转所有对应程序员通话的行(即,将 1 A B 变为 1 B A);参见下面的例子。考虑到 Bob 对第一个日志文件的修改,你应该给出所有客户提问的回答。

第一日志文件 第二日志文件(回答)
1 1 3
0 1 3 YES
1 1 4
0 5 2 NO
1 3 2
1 6 5
0 1 5 YES
1 4 5
0 5 3 NO
1 1 2
表 1. 第一个回答是 YES,因为软件包 1 应该在 3 之前安装。
修改后的第一日志文件
1 1 3
0 1 3
1 1 4
0 5 2 – 开始反转
1 2 3
1 5 6
0 1 5
1 5 4
0 5 3 – 停止反转
1 1 2
表 2. 反转后的软件包编号以粗体表示。

输入格式

输入包含多组测试数据。

第一行包含一个正整数 $Z \le 15$,表示测试数据的组数。接下来是 $Z$ 组测试数据,每组测试数据的格式如下:

每组测试数据的第一行包含两个整数 $n$ 和 $m$($1 \le n \le 10^5$,$0 \le m \le 10^5$),用单个空格隔开。它们分别表示 MacrOS 的软件包数量以及 Alpha 测试开始前的初始依赖关系数量。

接下来的 $m$ 行描述初始依赖关系列表。每行包含两个用单个空格隔开的数字 $A$ 和 $B$($1 \le A, B \le n$),表示软件包 $B$ 依赖于 $A$。某些依赖关系可能会多次出现,但不会出现成环的相互依赖关系(即不存在两个软件包互相依赖)。

输入的下一部分包含 Bob 修改后的第一个日志文件,格式如上所述。所有电话通话的总数最多为 $10^5$。

每组测试数据以包含三个零的行 0 0 0 结束。

输出格式

对于每组测试数据,程序应输出第二个日志文件的内容。这意味着对于输入中每个形如 0 A B 的行,如果应该先安装软件包 $A$,则输出 YES;如果应该先安装 $B$,则输出 NO

你可以假设所有的查询都有唯一的答案,即在进行该查询时,软件包 $A$ 和 $B$ 之间已经存在确定的依赖关系。

样例

输入样例 1

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

输出样例 1

YES
NO
YES
NO
YES
NO

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.