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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include<cstdio>
#include<vector>
#include<math.h>

int isNoPrime[50007];

void printNeg(int i)
{
    printf("3 %d\n", i);
}

std::vector<unsigned> sito(int n)
{
    std::vector<unsigned> primes{};
    int m = int(std::sqrt(n)+1.0);
    for(int i=2; i<=m; i++)
    {
        if(isNoPrime[i]) continue;
        primes.push_back(i);
        for(int j=2*i; j<=n; j+=i)
        {
            isNoPrime[j] = true;
        }
    }
    for(unsigned i=m+1; i<=n; i++)
    {
        if(isNoPrime[i]) continue;
        primes.push_back(i);
    }
    return primes;
}

int main()
{
    int n, s;
    scanf("%d %d", &n, &s);
    int operations=0;
    std::vector<int> bases{};
    std::vector<std::vector<int>> intersections{};
    std::vector<int> numberOfSetsToSum{};
    const auto primes = sito(n);
    for(int i=0; i<s; i++)
    {
        int a;
        scanf("%d", &a);
        bases.push_back(a);
        intersections.push_back({});
        std::vector<int>& v = intersections.back();
        v.push_back(a);
        if(a*2>n)
        {
            numberOfSetsToSum.push_back(a);
        }
        else
        {
            for(int j=0; j<n; j++)
            {
                int m = primes[j]*a;
                if(m > n) break;
                operations+=2;
                v.push_back(m);
                if(m==n) break;
            }
            numberOfSetsToSum.push_back(operations+n);
        } 
    }
    int bsize = bases.size();
    printf("%d\n", int(operations+numberOfSetsToSum.size()-1));
    int lastSetNumber = n;
    for(int i=0; i<bsize; i++)
    {
        int nn = intersections[i].size();
        if(nn > 1)
        {
            printNeg(intersections[i][1]);
            lastSetNumber++;
            printf("2 %d %d\n", intersections[i][0], lastSetNumber);
            lastSetNumber++;
        }
        for(int j=2; j<nn; j++)
        {
            printNeg(intersections[i][j]);
            lastSetNumber++;
            printf("2 %d %d\n", lastSetNumber-1, lastSetNumber);
            lastSetNumber++;
        }
    }
    if(numberOfSetsToSum.size()<=1) return 0;
    lastSetNumber++;
    printf("1 %d %d\n", numberOfSetsToSum[0], numberOfSetsToSum[1]);
    for(int i=2; i<numberOfSetsToSum.size(); i++)
    {
        printf("1 %d %d\n", lastSetNumber, numberOfSetsToSum[i]);
        lastSetNumber++;
    }
    return 0;
}