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

using namespace std;

typedef unsigned long INT;

/** Redirect stdin to provide input with Qt Creator */
void reopenInput(int argc, char** argv) {
#ifdef LOCAL
	if (argc > 1) {
		auto inFile = argv[1];
		cerr << "Reopening stdin to: " << inFile << endl;
		auto success = freopen(inFile, "r", stdin);
		if (!success) {
			cerr << "Error when opening file!" << endl;
			cerr << std::strerror(errno) << endl;
		}
	}
#endif
}

struct Bucket {
	bool y, b, r = false;

	bool inline isGreen() {
		return y && b && !r;
	}
};

int main(int argc, char** argv)
{
	reopenInput(argc, argv);

	INT n, // buckets
		m; // operations

	cin >> n >> m;

	vector<Bucket> buckets(n + 1, Bucket());

	cerr << "Buckets: " << n << endl;
	cerr << "Attempts: " << m << endl;

	for (INT i = 0; i < m; i++) {
		INT l, r, // bucket range indexed from 1 (!)
			k; // color ID

		cin >> l >> r >> k;

		for (INT j = l; j <= r; j++) {
			Bucket& buck = buckets[j];

			switch (k) {
				case 1: // yellow
					buck.y = true;
					break;
				case 2: // blue
					buck.b = true;
					break;
				case 3: // red
					buck.r = true;
					break;
			}
		}
	}

	INT greenCount = 0;

	for (INT j = 1; j <= n; j++) {
		if (buckets[j].isGreen()) greenCount++;
	}

	cout << greenCount << endl;

	return 0;
}