在电子游戏《Antichamber》中,玩家拥有一个名为 Brick 工具的特殊工具。你需要在一个简单的二维变体中模拟它的工作过程。
游戏在一个无限网格上进行。每个格子要么是白色,要么是黑色。如果两个格子共享一条边,则称它们是相邻的。黑色格子的极大连通集合被称为一个连通块。连通块的大小是其中包含的格子数量。
该工具允许玩家将任意一个格子翻转为相反的颜色。染色后会立即进行一系列检查,这些检查可能会改变网格的状态。
如果一个格子被染成了白色,且连通块的数量增加了,说明某个连通块分裂成了若干个子连通块。在这种情况下,新形成的子连通块将被移除,但可能保留其中最大的一个。只有当最大子连通块的大小严格大于所有其他子连通块大小之和时,该最大子连通块才不会被移除。移除一个连通块意味着将其中的所有格子重新染成白色。
接着,无论被染色的格子是什么颜色,连通块中的“洞”都会被消除:如果任何白色格子位于由黑色格子组成的环的内部,它就会被染成黑色。环中任意两个相邻的格子必须满足上述定义的相邻关系。
最初所有格子都是白色的。给定一个操作序列。每个操作要么是给一个格子染色,要么是一个查询。所有操作必须按给定顺序执行。
查询有两种类型:
Comp类型查询:给定的两个格子是否都是黑色且属于同一个连通块?Size类型查询:求包含给定格子的连通块的大小。如果该格子是白色的,则答案应为 0。
输入格式
第一行包含一个整数 $N$ — 操作和查询的总数($1 \le N \le 10^5$)。接下来的 $N$ 行,每行包含一个操作的描述。
操作格式如下:
Draw x y— 将坐标为 $(x, y)$ 的格子翻转为相反的颜色;Size x y— 求包含坐标为 $(x, y)$ 的格子的连通块大小;Comp x1 y1 x2 y2— 确定坐标为 $(x_1, y_1)$ 和 $(x_2, y_2)$ 的格子是否属于同一个连通块。
所有坐标均为不超过 $10^6$ 的正整数。
输出格式
按照查询在输入文件中出现的顺序,每行输出一个答案。
对于 Size 类型的查询,输出一个整数。
对于 Comp 类型的查询,输出 YES 或 NO。
样例
输入样例 1
38 Draw 2 2 Draw 2 3 Draw 2 4 Draw 2 5 Draw 2 6 Draw 3 6 Draw 4 6 Draw 5 5 Draw 5 4 Draw 4 4 Draw 4 2 Size 4 2 Size 2 4 Size 4 4 Size 3 3 Comp 2 2 2 4 Comp 2 2 4 4 Comp 3 3 4 4 Draw 3 2 Draw 4 3 Size 2 2 Draw 5 6 Size 2 2 Draw 3 3 Size 3 3 Comp 3 3 4 4 Draw 2 4 Draw 3 4 Draw 4 4 Size 3 2 Size 3 6 Draw 4 7 Draw 3 5 Size 2 5 Draw 4 6 Size 2 5 Size 4 5 Size 4 7
输出样例 1
1 7 3 0 YES NO NO 13 18 18 YES 0 9 9 0 0 0
说明
下图中的数字表示对应位置使用 Brick 工具的顺序。
第 14 次使用 Brick 工具后的游戏区域
第 15 次使用 Brick 工具不会引起游戏区域的变化
第 18 次使用 Brick 工具后的游戏区域
第 21 次使用 Brick 工具后,游戏区域中的所有格子将再次变回白色