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
//Drzewo przedzialowe przedzial-punkt rekurencyjnie, dodanie na przedziale, zapytanie w punkcie
//Zuzanna Ossowska
#include <bits/stdc++.h>

using namespace std;
const int limit=1<<5;
const int N=(1<<4); //potega dwojki-1, co najmniej tyle ile dlugosc ciagu

short int tree[limit]; //2*(N+1)

short int sprawdz(int w)
{
	short int wynik=0;
	w+=N;
	while (w>0)
	{
		wynik|=tree[w];
		w/=2;
	}
	return wynik;
}
///wierzcholek, left, right, poc, kon, zmiana
void zmien(int w, int p, int k, int x, int y, short int val)
{
	if (k<x || p>y) return;
	if (x<=p && k<=y)
	{
		tree[w]|=val;
		return;
	}
	//cout<<w<<"\n";
	zmien(w*2,p,(p+k)/2,x,y,val);
	zmien(w*2+1,(p+k)/2+1,k,x,y,val);
}
///do tego miejsca kod przeklejony
/// kod z obowu organizowanego przez
///stowarzyszenie talent 20pomorzanka09
///oczywiscie troche go zmodyfikowalem
///autor kodu do drzewa jest na poczatku
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin>>n>>m;
    //zmien(1, 0, N, 1, 5, 4);
   // cout<<sprawdz(0)<<sprawdz(1)<<sprawdz(2)<<sprawdz(3)<<sprawdz(4)<<sprawdz(5)<<sprawdz(6)<<sprawdz(7)<<"\n";
    for(int i=0; i<m; i++){
        int a, b;
        cin>>a>>b;
        short int kolor;
        cin>>kolor;
        if(kolor==3)kolor=4;
        zmien(1, 0, N-1, a-1, b-1, kolor);
    }
    int wynik=0;
    for(int i=0; i<n; i++){
        auto x=sprawdz(i);
        if(x==3){wynik++;}
    }
    cout<<wynik<<"\n";
}