小月的色图
题号:NC307950
时间限制:C/C++/Rust/Pascal 5秒,其他语言10秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

\hspace{15pt}你需要维护一个带颜色的无向图,支持边的动态切换与查询。

\hspace{15pt}图中有 n 个顶点,编号 1,2,\dots,n ,共有 C 种颜色,编号 1,2,\dots,C
\hspace{15pt}初始时给出 m 条边,每条边由三个整数 u, v, c 表示,含义为:这是一条连接顶点 u 和 v 的、颜色为 c 的无向边。
\hspace{15pt}接下来有 Q 次操作,操作分为两类:
\hspace{23pt}\bullet\,第一类:修改操作,切换边 (u,v) 在颜色 c 下的存在状态——若该颜色下该边当前不存在,则插入,否则删除。
\hspace{23pt}\bullet\,第二类:询问操作,询问当前时刻,有多少种颜色 c',使得由全部顶点、全部颜色为 c' 的边构成的子图是二分图。我们认为,相同的三元组 (u,v,c) 视为同一条边,且总是以 u < v 的形式表示。
\hspace{15pt}你需要依次输出所有查询操作的答案。

【名词解释】
\hspace{15pt}二分图:对于一张无向图,如果它的节点可以被分成两个不相交的集合 \Bbb{U}\Bbb{V},使得图中的每一条边都连接 \Bbb{U} 中的一个节点与 \Bbb{V} 中的一个节点,则称这张图为二分图。特别地,不包含任何边的图也是二分图。

输入描述:

\hspace{15pt}第一行输入四个整数 n,m,C,Q \left( 1\leq n,m,Q,C\leq 2\times 10^5 \right),表示图的顶点数量、边数量、颜色数量、操作数量。
\hspace{15pt}此后 m 行,第 i 行输入三个整数 u_i,v_i,c_i \left( 1\leq u_i \lt v_i\leq n;\, 1\leq c_i\leq C \right),表示第 i 条初始边双向连接顶点 u_iv_i,颜色为 c_i
\hspace{15pt}此后 Q 行,第 i 行先输入一个字符 o_i \left( o_i \in \left\{ \texttt{`T'}, \texttt{`Q'} \right\} \right),表示第 i 次操作的类型,随后在同一行:
\hspace{23pt}\bullet\,o_i = \texttt{`T'},表示修改操作,输入三个整数 u_i,v_i,c_i \left( 1\leq u_i \lt v_i\leq n;\, 1\leq c_i\leq C \right),表示切换的边的参数;
\hspace{23pt}\bullet\,o_i = \texttt{`Q'},表示询问操作,不需要输入任何信息。

\hspace{15pt}保证至少存在一次询问操作。

输出描述:

\hspace{15pt}对于每一次询问操作,新起一行输出一个整数,表示当前有多少种颜色的子图是二分图。
示例1

输入

复制
5 3 2 9
1 2 1
2 3 1
1 3 2
Q
Q
T 1 3 1
Q
T 2 3 1
Q
T 1 2 2
Q
Q

输出

复制
2
2
1
2
2
2