太尴尬了!Itaf 在她最近的“Python 基础编程”考试中只得了 0/5 分。她在 KTH 攻读工程物理学,但这门课让她感到非常吃力。她并不孤单,因为今年有 60% 的同学没能通过这门考试。这个高得离谱的挂科率的原因就是所谓的“框图与箭头图”(box and arrow diagram,瑞典语:låd- och pildiagram)。
在考试的这一部分,你需要根据一段 Python 代码,画出程序运行到某一行时内存结构的样子。由于 Itaf 是一位高水平的竞技编程选手,每当她尝试复习考试时,她的自负总是阻碍着她,因为她觉得这些内容“太简单了”。但现在她已经走投无路,需要你的帮助。
框图与箭头图用于解释 Python 内部的内存结构。简化来看,该图可以看作是一个有向图,其中节点(框)编号为 $1$ 到 $N$,边(箭头)编号为 $1$ 到 $M$。框对应于 Python 程序内存中的对象。框 $1$ 是特殊的,它代表全局对象(global object)。图中从框 $u$ 到框 $v$ 的箭头表示对象 $u$ 存储了对象 $v$ 的引用。如果 $u$ 存储了 $v$ 的多个引用,则从 $u$ 到 $v$ 会画出多条箭头。对象也可以包含指向自身的引用。
如果从全局对象出发,在框图与箭头图中存在一条到达对象 $u$ 的路径,则称对象 $u$ 是“存活的”(alive)。每个对象还有一个引用计数。对象 $u$ 的引用计数定义为满足“$v$ 是存活的”这一条件的箭头 $(v, u)$ 的数量。
Itaf 现在需要你的帮助,她会向你提出 $Q$ 个询问,每个询问可以是以下两种类型之一:
- $1\ X$:从图中移除编号为 $X$ 的箭头。
- $2\ Y$:输出编号为 $Y$ 的对象的引用计数。
输入格式
第一行包含两个空格分隔的整数 $N, M$ ($1 \le N, M \le 2 \cdot 10^5$),其中 $N$ 是图中框的数量,$M$ 是图中箭头的数量。
接下来的 $M$ 行描述图中的箭头。第 $i$ 行包含两个空格分隔的整数 $U_i, V_i$ ($1 \le U_i, V_i \le N$),表示编号为 $i$ 的箭头从框 $U_i$ 指向框 $V_i$。 注意,允许存在自环和重边。
下一行包含一个整数 $Q$ ($1 \le Q \le 2 \cdot 10^5$),表示询问的数量。接下来的 $Q$ 行描述这 $Q$ 个询问。第 $j$ 个询问由一对空格分隔的整数 $C_j, X_j$ ($1 \le C_j \le 2$) 给出。
- 如果 $C_j = 1$,则从图中移除编号为 $X_j$ 的箭头 ($1 \le X_j \le M$)。
- 如果 $C_j = 2$,则输出对象 $X_j$ 的引用计数 ($1 \le X_j \le N$)。
保证不会出现两个 $X_j$ 值相同的类型 1 询问,这意味着同一条箭头永远不会被删除两次。
输出格式
对于每个类型 2 的询问,输出一行,包含对象 $Y_j$ 的引用计数。
样例
样例输入 1
3 4 1 2 2 3 1 2 3 3 7 2 2 2 3 1 4 2 3 1 1 1 3 2 3
样例输出 1
2 2 1 0
Figure 1. 框图与箭头图示例,展示了 Python 内部的内存结构。