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
#include <iostream>
#include <fstream>

using namespace std;

#define rozm 1048576
#define rozm2 2097152

//const int rozm = 1<<20;
//const int rozm2 = 2*rozm;

struct dk{          ///numeracja od 0
    int dp[rozm2];
    dk(){
        for(int i=0; i<rozm2; i++) dp[i]=0;
    }
    int wartosc(int i){
        i |= rozm;
        int zwrot=0;
        while (i){
            zwrot+=dp[i];
            i>>=1;
        }
        return zwrot;
    }
    void dodaj(int i){
        i |= rozm;
        while(i>0){
            if(i & 1);
            else {i++; dp[i]--;}
            i>>=1;
        }
        dp[1]++;
    }
    void ujmij(int i){
        i |= rozm;
        while(i>0){
            if(i & 1);
            else {i++; dp[i]++;}
            i>>=1;
        }
        dp[1]--;
    }
    void zwiekszprzedzial(int a, int b){
        //cout << a << " " << b << endl;
        dodaj(b);
        if(a>0) ujmij(a-1);
    }
    void ogarnij(int i){
        if(i<rozm){
            dp[i<<1]+=dp[i];
            ogarnij(i<<1);
            dp[(i<<1)+1]+=dp[i];
            ogarnij((i<<1)+1);
            dp[i]=0;
        }
    }
};

dk kol1, kol2, kol3;
int n, m, l, r, k;

int main()
{
    scanf("%d %d", &n, &m);
    for(int i=0; i<m; i++){
        scanf("%d %d %d", &l, &r, &k);
        l--;
        r--;
        if(k==1) kol1.zwiekszprzedzial(l, r); else
        if(k==2) kol2.zwiekszprzedzial(l, r); else
        if(k==3) kol3.zwiekszprzedzial(l, r);
        //for(int i=0; i<n; i++)
            //cout << "T: " << kol1.wartosc(i) << " " << kol2.wartosc(i) << " " << kol3.wartosc(i) << endl;
    }
    kol1.ogarnij(1);
    kol2.ogarnij(1);
    kol3.ogarnij(1);
    int wynik=0;
    for(int i=rozm; i<rozm+n; i++)
        //cout << "T: " << kol1.dp[i] << " " << kol2.dp[i] << " " << kol3.dp[i] << endl;
        if(kol1.dp[i]>0 && kol2.dp[i] >0 && kol3.dp[i]==0) wynik++;
    printf("%d", wynik);
    return 0;
    for(int i=0; i<10; i++)
        kol1.zwiekszprzedzial(2*i, 2*i+1);
    for(int i=0; i<20; i++)
        cout << kol1.wartosc(i) << " ";
    cout << endl;
    kol1.ogarnij(1);
    for(int i=rozm; i<rozm+20; i++)
        cout << kol1.dp[i] << " ";
    return 0;
}