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;
typedef long long ll;

struct kolor
{
    bool czer=false,
         zol =false,
         nieb=false;
};


ll POCZ = 1<<20;
bool drzewo[(1<<21)][3];

void dodaj(ll l, ll p, ll k)//k = {0(zolty), 1(niebieski, 2(czerwony)}
{
    l+=POCZ;
    p+=POCZ;
    while(l<p)
    {
        if(l%2==1)
        {
            drzewo[l][k] = true;
            l++;
        }
        if(p%2==0)
        {
            drzewo[p][k] = true;
            p--;
        }
        l/=2;//przesuniecie w gore
        p/=2;
    }
    if(l==p)
        drzewo[l][k] = true;
}

kolor element(ll n)//{0(zolty), 1(niebieski, 2(czerwony)}
{
    kolor ret;
    n+=POCZ;
    while(n>1)
    {
        if(drzewo[n][0])
            ret.zol=true;
        if(drzewo[n][1])
            ret.nieb=true;
        if(drzewo[n][2])
            ret.czer=true;
        n/=2;
    }
    //jeszcze korzen trzeba dodac
    // n=1
    if(drzewo[n][0])
       ret.zol=true;
    if(drzewo[n][1])
        ret.nieb=true;
    if(drzewo[n][2])
        ret.czer=true;
    
    return ret;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll n,m;//puszki, operacje
    cin>>n>>m;
    while(m--)
    {
        ll l,r,k;
        cin>>l>>r>>k;
        dodaj(l-1,r-1,k-1);
    }
    ll ilosc = 0;
    for(ll i = 0; i<n; i++)
    {
        kolor kol = element(i);
        //cout<<i<<": "<<kol.zol<<kol.nieb<<kol.czer<<endl;
        if(kol.czer==false && kol.nieb == true && kol.zol == true)
            ilosc++;
    }
    cout<<ilosc;
}