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
#include <bits/stdc++.h>
using namespace std;
vector <int> t;
vector <pair<int,int> > trozm;
void addele(int v,int c){
    if ((t[v]&(1<<c))==0){
        t[v]+=(1<<c);
    }
}
bool czyzaw(pair<int,int> x, int a, int b){
    //cout << x.first<<" "<<x.second<<" "<<a<<" "<<b<<endl;
    if (a<=x.first && b>=x.second){
        return true;
    }
    return false;
}
void dodaj (int v,int a,int b,int c){
    //cout <<"->"<< v<<" "<<trozm[v].first<<" "<<trozm[v].second<<" "<<a<<" "<<b<<" "<<endl;
    if (czyzaw(trozm[1],a,b)){
        addele(1,c);
    }else{
        if (czyzaw(trozm[2*v],a,b)){
            addele(2*v,c);
            //cout << "czek1 "<<2*v<<endl;
        }
        if (czyzaw(trozm[2*v+1],a,b)){
            addele(2*v+1,c);
            //cout << "czek2 "<<2*v+1<<endl;
        }
        if (!czyzaw(trozm[2*v],a,b) && (czyzaw({a,a},trozm[2*v].first,trozm[2*v].second) || czyzaw({b,b},trozm[2*v].first,trozm[2*v].second))){
            //cout << "czek3 "<<2*v<<endl;
            dodaj(2*v, a, b,c);
        }
        if (!czyzaw(trozm[2*v+1],a,b) && (czyzaw({a,a},trozm[2*v+1].first,trozm[2*v+1].second) || czyzaw({b,b},trozm[2*v+1].first,trozm[2*v+1].second))){
            //cout << "czek4 "<<2*v+1<<endl;
            dodaj(2*v+1, a, b,c);
        }
    }

}
bool zapytaj (int i){
    int tmp=t[i];
    while (i>0){
        i/=2;
        tmp=tmp | t[i];
    }
    return tmp==3;
}
int main(){
    ios_base::sync_with_stdio(0);
    int n2=1;
    int n,q;
    cin >> n >> q;
    while(n2<n){
        n2*=2;
    }
    n2*=2;
    t.resize(n2);
    trozm.resize(n2);
    for (int i=n2/2;i<n2;i++){
        trozm[i].first=i;
        trozm[i].second=i;
    }
    for (int i=n2/2-1;i>=0;i--){
        trozm[i].first=min(trozm[2*i].first,trozm[2*i+1].first);
        trozm[i].second=max(trozm[2*i].second,trozm[2*i+1].second);
        //cout << i<<" "<<trozm[i].first<<" "<<trozm[i].second<<endl;
    }
    for (int q2=0; q2<q;q2++){
        int tmp, tmp2, tmp3;
        cin >> tmp>>tmp2>>tmp3;
        tmp--;
        tmp2--;
        tmp3--;
        dodaj(1,tmp+n2/2,tmp2+n2/2,tmp3);
        /*for (int i=0;i<n2;i++){
            cout << t[i]<<" ";
        }
        cout << endl;*/
    }
    int wynik=0;
    for (int i=0; i<n;i++){
        wynik+=zapytaj(i+n2/2);
        //cout << i << "<->"<<zapytaj(i+n2/2)<<endl;
    }
    cout << wynik<<endl;
}