1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <bits/stdc++.h>
using namespace std;

constexpr int MAX_N = 5e4;

int n, s, b;

vector<bitset<MAX_N>> sets;
bitset<MAX_N> target;

vector<pair<int, pair<int, int>>> ans;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> s;

    for(int i = 1; i <= n; i++) {
        sets.push_back(bitset<MAX_N>());

        for(int j = i; j <= n; j += i) {
            sets.back()[j - 1] = 1;
        }
    }

    for(int i = 1; i <= s; i++) {
        cin >> b;
        target[b - 1] = 1;
    }

    for(int i = 1; i <= n; i++) {
        if(sets.back()[i - 1] && !target[i - 1]) {
            sets.push_back(~sets[i - 1]);
            ans.push_back({3, {i, 0}});

            sets.push_back(sets[sets.size() - 2] & sets.back());
            ans.push_back({2, {sets.size() - 2, sets.size() - 1}});
        }
        else if(!sets.back()[i - 1] && target[i - 1]) {
            sets.push_back(sets[i - 1] | sets.back());
            ans.push_back({1, {i, sets.size() - 1}});
        }
    }
    
    cout << sets.size() - n << '\n';

    for(pair<int, pair<int, int>> i : ans) {
        cout << i.first << ' ' << i.second.first;

        if(i.second.second) {
            cout << ' ' << i.second.second;
        }

        cout << '\n';
    }
}