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
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>

using namespace std;
int r = 2;
int wyn = 0;
struct kolor {
	int niebiski = 0;
	int zolty = 0;
	int czerwony = 0;
	bool ziel()
	{
		if (niebiski && zolty && (!czerwony))return 1;
		else return 0;
	}
	kolor operator+(const kolor& b)
	{
		kolor k;
		k.niebiski = this->niebiski + b.niebiski;
		k.czerwony = this->czerwony + b.czerwony;
		k.zolty = this->zolty + b.zolty;
		return k;
	}

};


struct node{
	kolor val;
	node* left=NULL;
	node* right=NULL;
	bool lisc = 0;
};


void create(node* root,int l,int maxl)
{
	if (l > maxl)return;
	root->right = new node;
	root->left = new node;
	if (l == maxl)
	{
		root->left->lisc = 1;
		root->right->lisc = 1;
		return;
	}
	create(root->right,l+1,maxl);
	create(root->left, l+1, maxl);
}


void insert(node* root, int p, int q, kolor val ,int dp = 0, int dq = r - 1);
void insert(node* root, int p, int q, kolor val ,int dp, int dq )
{
	if (p <= dp and dq <= q)
	{
		root->val =root->val+ val;
	}
	else if (dq < p or q < dp)
	{
		return;
	}
	else
	{
		long long pp = 1 + (dq - dp) / 2;
		insert(root->left,p,q, val,dp,dq-pp);
		insert(root->right,p,q,val,dp+pp,dq);
	}
}

void query(node* root, int ind,kolor przep, int dp = 0, int dq = r - 1);
void query(node* root,int ind,kolor przep, int dp, int dq)
{
	przep = przep + root->val;
	if (ind <= dp and dq <= ind)
	{
		wyn += przep.ziel();
		return;
	}
	else if (dq < ind or ind < dp)
	{
		return ;
	}
	else
	{
		long long pp = 1 + (dq - dp) / 2;
		query(root->left, ind,przep, dp, dq - pp);
		query(root->right, ind,przep, dp + pp, dq);
	}
}

int main()
{
	int n, m;
	cin >> n >> m;

	int ml = 0;
	while (r<n)
	{
		r *= 2;
		ml++;
	}
	node* root = new node;
	create(root, 0, ml);
	for (int i = 0; i < m; ++i)
	{
		int pl, pr, k;
		cin >> pl >> pr >> k;
		kolor tmp;
		if (k == 1)tmp.zolty = 1;
		if (k == 2)tmp.niebiski = 2;
		if (k == 3)tmp.czerwony = 3;
		insert(root, pl, pr, tmp);
	}
	for (int i = 0; i < n; ++i)
	{
		kolor pom;
		query(root,i,pom);
	}
	cout << wyn<<endl;

}