Skip to content

P10002

P1002 图操作 -2

Description

初始给出一个两个各有 \(n\) 个点 \(0\) 条边的无向简单图 \(G_1=(V_1,E_1)\)\(G_2=(V_2,E_2)\),这 \(n\) 个点编号为 \(1∼n\),你的代码需要支持如下操作并返回结果:

  1. 指定某一个无向图,给出一个边集合 \(E\),对于每个 \(e=(u,v)\),若其已经在这个无向图的边集中,你需要将其从无向图中删去,否则将其加入无向图边集。
  2. 令某一个无向图变为自己的补图,对于无向简单图 \(G=(V,E)\),它的补图指的是这样的一张图:记作 \(\overline{G}\),满足 \(V(\overline{G})=V(G)\),且对任意节点对 \((u,v)\)\((u,v)\in E\) 当且仅当 \((u,v)\notin E\)
  3. 询问 \(E_1\)\(E_2\) 的大小。
  4. 询问两个无向图的交(即 \(G_1\cap G_2=(V_1\cap V_2,E_1\cap E_2)\))的边集的大小和两个无向图并(\(G_1\cup G_2=(V_1\cup V_2,E_1\cup E_2)\))的边集的大小。

无向简单图:没有自环和重边的无向图。

Format

Input

第一行两个整数 \(n,q\),分别表示节点个数和操作次数。

接下来 \(q\) 行,每行第一个整数 \(op\) 表示操作类型,若:

  • \(op=1\),接下来输入两个正整数 \(g,s\),表示当前操作第 \(g\) 个图,输入边集的大小为 \(s\),然后输入 \(2s\) 个整数 \(u_i,v_i\),表示边集的内容,其中 \(u_i,v_i\) 为插入边的两个顶点。
  • \(op=2\),接下来输入一个正整数 \(g\),表示令 \(G_g\) 变为自己的补图。
  • \(op=3\),表示询问 \(E_1\)\(E_2\) 的大小。
  • \(op=4\),询问两个无向图的交的边集的大小和两个无向图并的边集的大小。

本题共有 \(10\) 个测试点,每个测试点 \(10\) 分。

对于测试点 \(1,2\),满足 \(n,q\le 500,op\le 3\).

对于测试点 \(3,4\),满足 \(n,q\le 500\).

对于测试点 \(5,6\),满足 \(n,q\le 5000,op\in\{1,3,4\}\).

对于测试点 \(7,8\),满足 \(n,q\le 5000\).

对于全部测试点,保证 \(n,q\le 200000,op\in \{1,2,3,4\},g\in\{1,2\},u_i<v_i\le n,\sum s\le 5\times 10^5\)

保证所有操作满足题目描述,保证每一行的两个相邻整数都仅用一个空格隔开。

Output

对于每行 \(op=3\)\(op=4\) 的输入,都输出单独的一行表示结果,同一行输出多个数的用一个空格隔开,按照询问顺序给出。

Samples

Sample Input 1

4 9
1 1 3 1 2 1 3 1 4
1 2 3 1 3 2 3 3 4
3
4
2 1
4 
1 1 2 1 4 2 3
3
4

Sample Output 1

3 3
1 5
2 4
3 3
1 5