题目描述
题目译自 PA 2025 Runda próbna Zbiory 2
在这道题中,我们考虑一个包含 n+m 个集合的序列,这些集合都是 {1,…,n} 的子集。前 n 个集合 A1,…,An 的定义如下:对于 1≤i≤n,数字 i 属于集合 Aj 当且仅当 i 能被 j 整除。
例如,当 n=7 时,集合依次为:
- A1={1,2,3,4,5,6,7}
- A2={2,4,6}
- A3={3,6}
- A4={4}
- A5={5}
- A6={6}
- A7={7}
接下来的 m 个集合 An+1,An+2,…,An+m 通过对已有集合进行并集、交集或补集运算生成:
- 并集 Ai∪Aj:包含所有属于 Ai 或 Aj 的数字;
- 交集 Ai∩Aj:包含所有同时属于 Ai 和 Aj 的数字;
- 补集 Ai′:包含 {1,…,n} 中不属于 Ai 的所有数字。
例如,一组可能的运算序列可能是:
- A8=A5∪A7={5,7}
- A9=A2∩A3={6}
- A10=A8′={1,2,3,4,6}
- A11=A10∩A8={}
- A12=A3′={1,2,4,5,7}
- A13=A12∪A12={1,2,4,5,7}
- A14=A10∩A13={1,2,4}
- A15=A9∪A14={1,2,4,6}
给定 n 和目标集合 B,你的任务是确定一个操作次数 m (0≤m≤100000) 以及 m 个运算步骤,使得最终得到的集合 An+m 等于 B。可以证明,在任务限制下,任意 {1,…,n} 的子集都可通过不超过 m 的操作构造出来。
输入格式
输入的第一行包含两个整数 n,s (1≤n≤50000,1≤s≤n),分别表示初始集合数量和目标集合 B 的大小。第二行包含 s 个递增的整数 b1,b2,…,bs (1≤b1<b2<…<bs≤n),表示集合 B 的元素。
输出格式
输出的第一行包含一个整数 m (0≤m≤100000),表示操作次数。接下来的 m 行描述每次操作,每行对应生成集合 An+i 的方式,格式为以下三种之一:
1 x y
:表示并集 An+i=Ax∪Ay;
2 x y
:表示交集 An+i=Ax∩Ay;
3 x
:表示补集 An+i=Ax′。
要求 An+m=B,且每次操作的 x,y 必须满足 1≤x,y<n+i(仅引用之前的集合)。
7 4
1 2 4 6
3 1
3
第一个样例对应题目描述中的运算序列。
8
1 5 7
2 2 3
3 8
2 10 8
3 3
1 12 12
2 10 13
1 9 14
0
第二个样例不需要执行任何操作,因为 An=B。