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 <iostream>

using namespace std;

bool tab[2097152][3];
int n, m, l, r, ile;

void dodaj(int obecny, int pocz, int kon, int poczOb, int konOb, int ile){
    if(pocz == poczOb && kon == konOb){
        tab[obecny][ile] = true;
    }
    else{
        int s1 = obecny*2;
        int s2 = obecny*2+1;
        int srodek = (poczOb+konOb)/2;
        if(kon <= srodek){
            dodaj(s1, pocz, kon, poczOb, srodek, ile);
        }
        if(pocz > srodek){
            dodaj(s2, pocz, kon, srodek+1, konOb, ile);
        }
        if(kon > srodek && pocz <= srodek){
            dodaj(s1, pocz, srodek, poczOb, srodek, ile);
            dodaj(s2, srodek+1, kon, srodek+1, konOb, ile);
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> m;
    for(int i = 0; i < m; i++){
        cin >> l >> r >> ile;
        dodaj(1, l, r, 1, 1048576, ile-1);
    }
    int wynik = 0;
    for(int i = 0; i < n; i++){
        bool tmp[3];
        tmp[0] = false;
        tmp[1] = false;
        tmp[2] = false;
        int u = 1048576+i;
        while(u != 0){
            tmp[0] = (tmp[0]|tab[u][0]);
            tmp[1] = (tmp[1]|tab[u][1]);
            tmp[2] = (tmp[2]|tab[u][2]);
            u /= 2;
        }
        if(tmp[0] && tmp[1] && (tmp[2] == 0)){
            wynik++;
        }
    }
    cout << wynik;
    return 0;
}