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
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int YELLOW = 1;
const int BLUE = 2;
const int RED = 3;

struct Data {
  int l, r, color;
};


int solve(const vector<Data>& A, int n) {
  vector<int> yellow_events(n + 1, 0);
  vector<int> blue_events(n + 1, 0);
  vector<int> red_events(n + 1, 0);

  for(auto it: A) {
    if(it.color == RED) {
      red_events[it.l] += it.r;
      red_events[it.r + 1] -= it.r;
    } else if(it.color == BLUE) {
      blue_events[it.l] += it.r;
      blue_events[it.r + 1] -= it.r;
    } else if(it.color == YELLOW) {
      yellow_events[it.l] += it.r;
      yellow_events[it.r + 1] -= it.r;
    }
  }

  vector<int> yellow_dec(n + 1, 0);
  vector<int> blue_dec(n + 1, 0);
  vector<int> red_dec(n + 1, 0);
  
  int ans = 0;
  ll yellow = 0, blue = 0, red = 0;
  for(int i = 1; i <= n; i++) {
    yellow += (yellow_events[i] + yellow_dec[i]);
    blue += (blue_events[i] + blue_dec[i]);
    red += (red_events[i] + red_dec[i]);
    if(yellow > 0 && blue > 0 && red == 0) {
      ans++;
    }
  }
  return ans;
}

// int brute(const vector<Data>& A, int n) {
//   vector<int> red_events(n + 1, 0);
//   vector<int> blue_events(n + 1, 0);
//   vector<int> yellow_events(n + 1, 0);
//   for(auto it: A) {
//     if(it.color == RED) {
//       for(int i = it.l; i <= it.r; i++) red_events[i]++; 
//     } else if(it.color == BLUE) {
//       for(int i = it.l; i <= it.r; i++) blue_events[i]++; 
//     } else if(it.color == YELLOW) {
//       for(int i = it.l; i <= it.r; i++) yellow_events[i]++; 
//     }
//   }
//   ll ans = 0;
//   for(int i = 1; i <= n; i++) {
//     if(yellow_events[i] > 0 && blue_events[i] > 0 && red_events[i] == 0) ans++;
//   }
//   return ans;
// }

// void gen() {
//   srand(time(nullptr));
//   vector<Data> A;
//   size_t errors = 0;
//   for(int i = 12; i <= 1000; i++) {
//     int n = i;
//     for(int op = 1; op <= i + i; op++) {
//       for(int j = 0; j < op; j++) {
//         int l = rand() % (i - 11) + 1; 
//         int r = l + (rand() % 10);
//         A.push_back({l, r, rand() % 3 + 1});
//       }
//       if(solve(A, n) == brute(A, n)) {
//         cout << "\r ok. op: " << op << ", n: " << n << flush;
//       } else {
//         cerr << "bug. expected: " << brute(A, n) << ", got: " << solve(A, n) << endl;
//         cerr << "op: " << op << ", n: " << n << endl;
//         for(auto it: A) {
//           cerr << "(" << it.l << "," << it.r << "," << it.color << ")" << endl;
//         }
//         errors++;
//       }
//       A.clear();
//     }
//   }
//   cout << "\nerrors: " << errors << endl;
// }

int main(int argc, char const *argv[]) {
  int n, m;
  cin >> n >> m;
  vector<Data> A(m);
  for(int i = 0; i < m; i++) {
    int a, b, color;
    cin >> a >> b >> color;
    A[i] = { a, b, color };
  }
  cout << solve(A, n) << endl;
//   gen();
  return 0;
}